据我所知,使类sealed
摆脱了在VTable中的查找,还是我错了?如果我将类设为sealed
,这是否意味着类层次结构中的所有虚拟方法也都标记为sealed
?
例如:
public class A {
protected virtual void M() { ........ }
protected virtual void O() { ........ }
}
public sealed class B : A {
// I guess I can make this private for sealed class
private override void M() { ........ }
// Is this method automatically sealed? In the meaning that it doesn't have to look in VTable and can be called directly?
// Also what about O() can it be called directly too, without VTable?
}
最佳答案
您不能在继承层次结构中更改访问修饰符。这意味着如果方法在基类中是public
,则不能在派生类中将其设置为private
或internal
或protected
。仅当您将方法声明为new
时,才能更改修饰符:
private new void M() { ........ }
密封类在层次结构中排在最后,因为您不能从其继承。如果
sealed
类覆盖了基类中的某些方法,则虚拟表可以与sealed
类一起使用。您可以看到IL代码:
.method family hidebysig virtual // method is not marked as sealed
instance void M () cil managed
{
.maxstack 8
IL_0000: nop
IL_0001: ret value
}
方法未标记为
sealed
。即使您将此方法明确标记为sealed
,您也将获得相同的IL代码。另外,没有理由在
sealed
类中将方法标记为sealed
。如果class是sealed
,则不能继承它,也不能继承它的方法。关于虚拟表-如果方法被覆盖,并且您从虚拟表中将其删除,则您永远不能在继承层次结构中使用它,因此,没有理由要覆盖方法,也不要在继承层次结构中使用它。