新的关键字和方法隐藏

时间:2015-05-13 07:19:11

标签: 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(); 
    } 
} 

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

2 个答案:

答案 0 :(得分:20)

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

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

答案 1 :(得分:5)

通常,隐藏在C#中的工作方式如下:“hider”(方法或字段或用new关键字声明的任何内容)接管它可以从“隐藏”的任何“功能”。例如:

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

此处,fun中的Derived1完全隐藏了fun中的Baseclass,因为它们具有完全相同的“功能”:它们都是方法,都是{{} 1}},即可从任何地方获得。

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

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();

new Modifier page上的MSDN上甚至提到了这个具体的例子:

  

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

你的情况非常相似。两个派生类中的fun方法只隐藏了基类中原始fun的一部分。如果您从funfun内拨打Derived1,则最终会得到相应班级的Derived2版本的“hider”版本。但是,当您从三个班级之外拨打foo时,会调用foo public方法,因为其Baseclass功能尚未隐藏......