好吧,您有一些编译器错误,但这是基于您的示例的更正版本。
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
.
编辑:请记住,为了被允许override
在Derived
类上使用,您需要Base.abc
使用virtual
关键字标记。此外,您不能制作fields virtual
。您需要使用属性来使用virtual
关键字。不过,您不应该一开始就公开字段,所以这通常不是问题。