新的关键字和方法隐藏

Pro*_*zzz 14 c# inheritance

新的关键字用于隐藏相同的基类实现.但我不确定为什么以下代码将输出生成为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(); 
    } 
} 
Run Code Online (Sandbox Code Playgroud)

我们在derived2中隐藏了fun的实现但是仍然调用Base类为什么呢?我错过了什么吗?

Sri*_*vel 20

Derived2.fun是私有的(它是该类型成员的默认访问修饰符).在课堂外不可见.只有fun类外的可见方法Baseclass.fun才被调用.

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


Min*_*s97 5

通常,隐藏在C#中的工作原理如下:"hider"(一个方法或字段或用new关键字声明的任何东西)接管它可以从"隐藏"的任何"功能".例如:

class Baseclass
{ 
    public void fun()
    { 
        Console.Write("Base class" + " ");
    } 
} 
class Derived1 : Baseclass
{ 
    new public void fun()
    {
        Console.Write("Derived1 class" + " "); 
    } 
}
Run Code Online (Sandbox Code Playgroud)

在这里,funDerived1funBaseclass完全的,因为它们拥有完全相同的"功能":他们是两种方法,并且都public,即可以从任何地方.

但是,如果"hider"没有覆盖所有"隐藏"成员的功能,它仍然会在那里,准备好完成它的工作.例:

class Baseclass
{ 
    public void fun()
    { 
        Console.Write("Base class" + " ");
    } 
} 
class Derived1 : Baseclass
{ 
    new public int fun;
}
Run Code Online (Sandbox Code Playgroud)

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了基类中原始的一部分.如果你调用fun从内Derived1或者Derived2,你将最终获得的"藏起来"的版本foo各自的类.但是,当您foo从外部调用三个类时,会调用public方法Baseclass,因为它的public功能尚未被隐藏...