.net 如果我抑制“覆盖”怎么办?
我注意到,如果我抑制override/new重载/Shadows关键字,编译器将生成一条警告。通常,我会设置必要的关键字 但是如果我忘了呢.net 如果我抑制“覆盖”怎么办?,.net,oop,virtual,keyword,.net,Oop,Virtual,Keyword,我注意到,如果我抑制override/new重载/Shadows关键字,编译器将生成一条警告。通常,我会设置必要的关键字 但是如果我忘了呢 // >>>> Case A - not virtual property - class MyPoint : Point { int X { get; set; } // vs new int X { get; set; } } // >>>> Case B - virtual property -
// >>>> 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; } }
}
这取决于你的目标。如果您正在创建一个新方法,实际上可以省去new关键字,只处理警告。为了清晰起见,存在新的方法
另一方面,如果您打算覆盖继承的虚拟方法,忽略覆盖实际上会创建一个新方法,继承的方法不会被覆盖。这取决于您的目标。如果您正在创建一个新方法,实际上可以省去new关键字,只处理警告。为了清晰起见,存在新的方法
另一方面,如果您的意图是覆盖继承的虚拟方法,忽略覆盖实际上会创建一个新方法,而继承的方法不会被覆盖。如果您忘记覆盖/新建,值的作用就像您在它前面放置了新值一样。如果您忘记覆盖/新建,值的作用就像您将new放在它前面一样。那么您不是在重写属性,而是在创建一个新属性,就像使用new关键字一样
当用方法演示时,这一点通常更清楚——在这种情况下,即使重写,两个类中仍然有一个单独的备份字段,只是其中一个字段是多余的。在不重写的情况下,您有两个支持字段,通过属性访问哪一个字段将取决于用于访问它的表达式的编译时类型。那么您不是重写属性,而是创建一个新字段,就像使用了new关键字一样
当用方法演示时,这一点通常更清楚——在这种情况下,即使重写,两个类中仍然有一个单独的备份字段,只是其中一个字段是多余的。在不重写的情况下,您有两个支持字段,通过属性访问哪一个将取决于用于访问它的表达式的编译时类型。换句话说,我始终有两个支持字段,new just use都使用。换句话说,我始终有两个支持字段,new just use都使用。
Bar x = new Bar();
Foo y = x;
Console.WriteLine(x.Value); // Uses Bar.Value
Console.WriteLine(y.Value); // Uses Foo.Value