The virtual关键字用于修改方法、属性、索引器或事件声明,并允许在派生类中重写它。例如,任何继承它的类都可以重写此方法:
使用 new 修饰符显式隐藏从基类继承的成员。要隐藏继承的成员,请在派生类中使用相同的名称声明它,并使用 new 修饰符对其进行修改。
这都与多态性有关。当对引用调用虚拟方法时,引用所引用的对象的实际类型用于决定使用哪个方法实现。当在派生类中重写基类的方法时,即使调用代码不“知道”该对象是派生类的实例,也会使用派生类中的版本。例如:
public class Base {
public virtual void SomeMethod() {
}
}
public class Derived : Base {
public override void SomeMethod() {
}
}
...
Base d = new Derived();
d.SomeMethod();
如果覆盖 Base.SomeMethod,最终将调用 Derived.SomeMethod。
现在,如果您使用new关键字而不是override,派生类中的方法不会覆盖基类中的方法,它只是隐藏它。在这种情况下,代码如下:
public class Base {
public virtual void SomeOtherMethod() {
}
}
public class Derived : Base {
public new void SomeOtherMethod() {
}
}
...
Base b = new Derived();
Derived d = new Derived();
b.SomeOtherMethod();
d.SomeOtherMethod();
将首先调用 Base.SomeOtherMethod ,然后调用 Derived.SomeOtherMethod 。它们实际上是两个完全独立的方法,恰好具有相同的名称,而不是派生方法重写基本方法。
如果您不指定 new 或 overrides,则结果输出与指定 new 相同,但您还会收到编译器警告(因为您可能不知道您在基类中隐藏了方法)方法,或者实际上您可能想覆盖它,只是忘记包含关键字)。
压倒一切的属性声明可能包括sealed修饰符。使用此修饰符可防止派生类进一步重写该属性。密封属性的访问器也被密封。