0

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

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”?我认为派生类的成员“隐藏”了基类的相同成员......

4

3 回答 3

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修饰符关键字而不显式使用它。new关键字隐藏了一个基成员,但是如果具体类被强制转换为其基类型,则新属性不会被使用并且无法访问,直到它再次“向下转换”到具体类。

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

编辑:请记住,为了被允许overrideDerived类上使用,您需要Base.abc使用virtual关键字标记。此外,您不能制作fields virtual。您需要使用属性来使用virtual关键字。不过,您不应该一开始就公开字段,所以这通常不是问题。

于 2010-01-06T20:28:00.500 回答
0

当然你会看到2。为什么你认为你会看到 3 ?

但是你会得到一个警告:

“Derived.abc”隐藏了继承的成员“Base.abc”。如果打算隐藏,请使用 new 关键字。

所以你可以解决它:

class Derived : Base {
    public new int abc = 2;
}
于 2010-01-06T20:27:27.967 回答
0

忽略代码中明显且众多的错误:O,您断言“我确定您会在控制台上看到'2'”是正确的,您会的,我会的!

你真的应该用户

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

如果隐藏继承值是您的意图

于 2010-01-06T20:23:12.687 回答