我注意到如果我禁止覆盖/新建(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; } }
}
答案 0 :(得分:5)
然后你没有覆盖该属性,而是创建一个新属性,就像使用new
关键字一样。
Bar x = new Bar();
Foo y = x;
Console.WriteLine(x.Value); // Uses Bar.Value
Console.WriteLine(y.Value); // Uses Foo.Value
当使用方法演示时,这通常更清晰 - 在这种情况下,即使你重写,你仍然在两个类中都有一个单独的支持字段,只是其中一个字段将是多余的。 没有覆盖,你有两个支持字段,你通过属性访问的字段将取决于你用来访问它的表达式的编译时类型。
答案 1 :(得分:3)
如果您忘记override
/ new
,则值的运行就像您将new
放在其前一样。
答案 2 :(得分:1)
这取决于你的目标。如果您正在创建一个“新”方法,您实际上可以省略“new”关键字,并且只处理警告。为了清楚起见,存在“新”。
另一方面,如果您的目的是覆盖继承的虚方法,那么省略“覆盖”实际上最终会创建一个“新”方法,并且不会覆盖继承的方法。