与覆盖关联的密封关键字



是否总是需要在方法的签名中跟overridesealed 关键字,如下所示的代码:

public sealed override string Method1(){.....}

我的意思是,如果我想在不重写的情况下将方法"密封"在基类中,override关键字是否仍然必要?

密封方法只有在重写时才有意义。

这里发生的情况如下:
您正在重写基类(override)中的方法,并告诉编译器不再允许从您的类派生的类覆盖此方法(sealed)。

如果该方法是您在类中声明的新方法,并且您希望防止派生类重写它,请不要将其声明为虚拟方法。

如果该方法在基类中声明,但不是可重写的密封,则没有任何意义,因为它已经无法重写。

我认为希尔加斯先生在这里提供了最好的答案,但只是为了为以前有 Java 背景的程序员(比如我自己)添加一些新的东西,我认为大多数刚接触 C# 的程序员在覆盖方面往往会将sealedJava中的final混淆。

Java 中,未指定"any"修饰符的默认行为是可以在其派生类中重写该方法。

C# 中,默认行为是除非使用 virtual 关键字显式指定,否则无法重写该方法。

希望这有助于补充上述最佳答案。

好吧,从技术上讲这是可能的....但是,解决方案在我的选择中有点脏。

想象一下,有一个类A(在你的代码库或外部库中):

public class A
{
    public virtual void M () { /* implementation */ }
}

您可以定义一个(抽象)类B : A如下所示:

public class B : A
{
    public sealed override void M() => base.M();
}

任何类C : B都无法重写A.M,因为您已经密封了该方法(即使您没有进行任何语义更改)。

最新更新