ser*_*hio 1 .net oop virtual keyword
我注意到如果我禁止覆盖/新(Overloads/Shadows)关键字,编译器会生成警告.通常,我设置必要的关键字.
但是,如果我忘了它呢?
// >>>> Case A - not virtual property -
class MyPoint : Point
{
int X { get; set; } // vs new int X { get; set; }
}
// >>>> Case B - virtual property -
class Foo
{
virtual int Value { get { return 0; } }
}
class Bar : Foo
{
// vs override/new int Value { get { return 1; } }
int Value { get { return 1; } }
}
Run Code Online (Sandbox Code Playgroud)
然后你没有覆盖属性,你正在创建一个新属性,就像你使用了new
关键字一样.
Bar x = new Bar();
Foo y = x;
Console.WriteLine(x.Value); // Uses Bar.Value
Console.WriteLine(y.Value); // Uses Foo.Value
Run Code Online (Sandbox Code Playgroud)
当用方法演示时,这通常更清晰 - 在这种情况下,即使你重写,你仍然在两个类中都有一个单独的支持字段,只是其中一个字段将是多余的.在没有覆盖的情况下,您有两个支持字段,您通过该属性访问的字段将取决于您用于访问它的表达式的编译时类型.