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
.原因是,除非您显式覆盖基类的成员,否则它将仅应用于具体类的实例.
在派生类中,您实际上使用的是new
modifier关键字而未明确使用它.该new
关键字隐藏的基座部件,但是如果具体的类强制转换为它的基类型,新的属性没有得到使用,无法访问,直到它"铸下"的具体类一次.
在第二个示例中,Derived
类被强制转换为a Base
,因此它将使用该Base
abc
属性.如果你要使用override
关键字,那么第二行也会输出一个2
.
编辑:请记住,为了允许override
在Derived
课堂上使用,您需要Base.abc
使用virtual
关键字进行标记.此外,你不能创建字段 virtual
.您需要使用" 属性"来使用virtual
关键字.你不应该开始暴露字段,所以这通常不是问题.