C#隐藏成员

时间:2010-01-06 20:18:48

标签: c# inheritance base derived 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);
}

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

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

3 个答案:

答案 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;
}