新的关键字和方法隐藏



新的Keyword用于隐藏相同的基类实现。但我不确定为什么下面的代码会产生基类的输出

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的实现,但基类仍然被调用,为什么这样?我是不是错过了什么?

Derived2.fun是私有的(它是该类型成员的默认访问修饰符)。它在类外不可见。类之外唯一可见的fun方法是Baseclass.fun,因此它被调用。

您需要使Derived2.fun在类外可见,以获得预期的输出。你可以通过公开/内部的方式来做到这一点。

通常,隐藏在C#中的工作方式是这样的:"hider"(一个方法或字段或用new关键字声明的任何东西)接管了它可以从"隐藏"中获得的所有"功能"。例如:

class Baseclass
{ 
public void fun()
{ 
Console.Write("Base class" + " ");
} 
} 
class Derived1 : Baseclass
{ 
new public void fun()
{
Console.Write("Derived1 class" + " "); 
} 
}

这里,Derived1中的fun完全隐藏了Baseclass中的fun,因为它们具有完全相同的"功能":它们都是方法,都是public,即在任何地方都可以使用。

然而,如果"隐藏者"没有涵盖"隐藏"成员的所有功能,它仍然会在那里,准备好完成它的工作。示例:

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;失败。

但是,如果我们对fun做一些int字段不能做的事情,会发生什么?new Derived1().fun();将工作,调用基类中的fun

这个特定的例子甚至在MSDN上的新修改器页面上被提到:

通常,在类或结构中引入的常量、字段、属性或类型会隐藏共享其名称的所有基类成员。有一些特殊情况。例如,如果您声明名称为N的新字段具有不可调用的类型,而基类型声明N为方法,则新字段不会在调用语法中隐藏基声明。

您的情况非常相似。两个派生类中的fun方法只隐藏了基类中原始fun的一部分。如果从Derived1Derived2内部调用fun,则最终会得到相应类的foo的"隐藏"版本。然而,当您从三个类之外调用foo时,会调用Baseclasspublic方法,因为它的public功能没有被隐藏。。。

最新更新