好吧,您有一些编译器错误,但这是基于您的示例的更正版本。
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关键字。不过,您不应该一开始就公开字段,所以这通常不是问题。