如何禁止在C#中重写类方法/属性?

Iva*_*van 8 .net c# overriding sealed

我相信我希望类的一些方法和属性是不可重写的,并在所有派生类中使用base的实现.怎么做到这一点?sealed关键字似乎不起作用,并说"方法不能被密封,因为它不是覆盖".

Jon*_*eet 15

默认情况下,成员在C#中被密封 - 除非它们被标记为虚拟,否则它们无法在派生类中被覆盖.

不可否认,它们可以在派生类中被遮蔽:

public new void SomeMethod()
{
}
Run Code Online (Sandbox Code Playgroud)

......但这与重写不一样.你无法阻止这种情况,但是如果调用者使用基类的编译时类型,他们最终不会意外地调用它.

如果你可以给我们更多的细节恰好(被称为从主叫方的POV和代码两者)你想阻止什么,我们也许能够帮助更多.


har*_*rpo 5

除非您将其标记为,否则不会覆盖的方法不会被覆盖virtual.所以听起来在你的情况下不需要采取任何行动.

class A
{
    public void B() {} // can't override
    public virtual C() {} // can override
    public virtual D() {} // can override
}
Run Code Online (Sandbox Code Playgroud)

sealed仅当方法已经覆盖基类中的成员时,修饰符才适用.这使您可以防止在覆盖的子类类.

class A1 : A
{
    public void B() {} // shadows A.B.  Not a virtual method!
    public override C() {} // overrides A.C, subclasses can override
    public override sealed D() {} // overrides A.D, subclasses cannot override
                                  // (but can shadow)
}
Run Code Online (Sandbox Code Playgroud)