新的关键字和方法隐藏

新的关键字用于隐藏相同的基类实现。 但我不确定为什么以下代码将输出生成为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一部分。 如果你从Derived1Derived2内部调用fun ,你将得到相应类的foo的“hider”版本。 但是,当您从三个类之外调用foo时,会调用Baseclasspublic方法,因为它的publicfunction尚未被隐藏…