在下面的例子中,会发生什么?
class Base {
public int abc = 3;
}
Class Derived : Base {
public int abc = 2;
}
static void Main() {
Derived blah = new Derived();
Console.WriteLine(blah.abc);
}
我相信你会在你的控制台上看到'2',但我正在阅读(和看到的)反对...
为什么你会看到'3'而不是'2'?我认为派生类的成员'隐藏'基类的相同成员......
答案 0 :(得分: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);
}
第一行将输出2
。第二行将输出3
。原因是,除非您显式覆盖基类的成员,否则它只适用于具体类的实例。
在派生类中,您基本上使用new
modifier keyword而未明确使用它。 new
关键字隐藏基本成员,但是如果将具体类强制转换为其基类型,则新属性不会被使用,并且在“强制转换”之前无法访问 - 再次“到具体课堂。
在第二个示例中,Derived
类被转换为Base
,因此它将使用Base
abc
属性。如果您使用override
keyword,那么第二行也会输出2
。
修改:请注意,为了在override
课程中使用Derived
,您需要使用{{Base.abc
标记virtual
3}}。另外,您无法制作virtual
keyword virtual
。您需要使用fields来使用{{1}}关键字。你不应该开始暴露字段,所以这通常不是问题。
答案 1 :(得分:0)
忽略代码中显而易见的大量错误:O,你的断言“我确定你会在控制台上看到'2'”是正确的,你会,而且我会这样做!
你应该真的是用户
class Derived : Base {
public new int abc = 2;
}
如果隐藏继承的值是你的意图
答案 2 :(得分:0)
当然,您会看到 2 。为什么你认为你会看到3?
但你会收到警告:
'Derived.abc'隐藏了继承的成员 'Base.abc'。使用新关键字if 隐藏的意图。
所以你可以解决它:
class Derived : Base {
public new int abc = 2;
}