是否总是需要在方法的签名中跟override
的 sealed
关键字,如下所示的代码:
public sealed override string Method1(){.....}
我的意思是,如果我想在不重写的情况下将方法"密封"在基类中,override
关键字是否仍然必要?
密封方法只有在重写时才有意义。
这里发生的情况如下:
您正在重写基类(override
)中的方法,并告诉编译器不再允许从您的类派生的类覆盖此方法(sealed
)。
如果该方法是您在类中声明的新方法,并且您希望防止派生类重写它,请不要将其声明为虚拟方法。
如果该方法在基类中声明,但不是可重写的密封,则没有任何意义,因为它已经无法重写。
我认为希尔加斯先生在这里提供了最好的答案,但只是为了为以前有 Java 背景的程序员(比如我自己)添加一些新的东西,我认为大多数刚接触 C# 的程序员在覆盖方面往往会将sealed
与Java
中的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
,因为您已经密封了该方法(即使您没有进行任何语义更改)。