新的关键字和方法隐藏
新的关键字用于隐藏相同的基类实现。 但我不确定为什么以下代码将输出生成为Baseclass
class Baseclass { public void fun() { Console.Write("Base class" + " "); } } class Derived1: Baseclass { new void fun() { Console.Write("Derived1 class" + " "); } } class Derived2: Derived1 { new void fun() { Console.Write("Derived2 class" + " "); } } class Program { public static void Main(string[ ] args) { Derived2 d = new Derived2(); d.fun(); } }
我们在derived2中隐藏了fun的实现但是仍然调用Base类为什么呢? 我错过了什么吗?
Derived2.fun
是私有的(它是该类型成员的默认访问修饰符)。 在课外不可见。 该类外只有可见的fun
方法是Baseclass.fun
,因此它被调用。
您需要在类外部显示Derived2.fun
以获得预期输出。 你可以通过公开/内部来做到这一点。
通常,隐藏在C#中的工作方式如下:“hider”(方法或字段或使用new
关键字声明的任何内容)接管它可以从“隐藏”的任何“function”。 例如:
class Baseclass { public void fun() { Console.Write("Base class" + " "); } } class Derived1 : Baseclass { new public void fun() { Console.Write("Derived1 class" + " "); } }
在这里, Derived1
fun
完全隐藏了Derived1
fun
,因为它们具有完全相同的“function”:它们都是方法,并且都是public
,即可以从任何地方获得。
但是,如果“hider”没有覆盖所有“隐藏”成员的function,它仍然会在那里,准备好完成它的工作。 例:
class Baseclass { public void fun() { Console.Write("Base class" + " "); } } class Derived1 : Baseclass { new public int fun; }
这里, Baseclass.fun
是一个方法, Derived1.fun
是一个字段。
您可以访问赋值表达式中的“隐藏”字段,如下所示: int a = new Derived1().fun;
。 因为它隐藏了基类方法的fun
,所以你无法以这种方式访问它(方法): System.Action a = new Derived1().fun;
失败。
但是如果我们做一些int
领域无法做到的事情会发生什么呢? new Derived1().fun();
会工作,在基类中调用fun
!
在MSDN上的新修改器页面上甚至提到了这个具体的例子:
通常,类或结构中引入的常量,字段,属性或类型会隐藏共享其名称的所有基类成员。 有特殊情况。 例如,如果声明名为N的新字段具有不可调用的类型,并且基类型将N声明为方法,则新字段不会隐藏调用语法中的基本声明。
你的情况非常相似。 两个派生类中的fun
方法只是隐藏了基类中原始fun
一部分。 如果你从Derived1
或Derived2
内部调用fun
,你将得到相应类的foo
的“hider”版本。 但是,当您从三个类之外调用foo
时,会调用Baseclass
的public
方法,因为它的public
function尚未被隐藏…