C#隐藏成员

Xen*_*ate 0 c# inheritance derived base member-hiding

在下面的例子中,会发生什么?

class Base {
    public int abc = 3;
}

Class Derived : Base {
    public int abc = 2;
}

static void Main() {
   Derived blah = new Derived();
   Console.WriteLine(blah.abc);
}
Run Code Online (Sandbox Code Playgroud)

我相信你会在你的控制台上看到'2',但我正在阅读(和看到)反对...

为什么你会看到'3'而不是'2'?我认为派生类的成员'隐藏'基类的相同成员...

Dan*_*ert 10

好吧,你有一些编译错误,但这是一个基于你的例子的更正版本.

class Base {
    public int abc = 3;
}

class Derived : Base {
    public int abc = 2;
} 

static void Main(string[] args)
{
    Derived foo = new Derived();
    Console.WriteLine(foo.abc);
    Base bar = new Derived();
    Console.WriteLine(bar.abc);
}
Run Code Online (Sandbox Code Playgroud)

第一行将输出一个2.第二行将输出一个3.原因是,除非您显式覆盖基类的成员,否则它将仅应用于具体类的实例.

在派生类中,您实际上使用的是newmodifier关键字而未明确使用它.该new关键字隐藏的基座部件,但是如果具体的类强制转换为它的基类型,新的属性没有得到使用,无法访问,直到它"铸下"的具体类一次.

在第二个示例中,Derived类被强制转换为a Base,因此它将使用该Base abc属性.如果你要使用override关键字,那么第二行也会输出一个2.

编辑:请记住,为了允许overrideDerived课堂上使用,您需要Base.abc使用virtual关键字进行标记.此外,你不能创建字段 virtual.您需要使用" 属性"来使用virtual关键字.你不应该开始暴露字段,所以这通常不是问题.