是否始终需要在以下代码的方法签名中使用sealed
关键字override
:
public sealed override string Method1(){.....}
我的意思是,如果我想在没有覆盖的情况下“密封”基类中的方法,是否还需要override
关键字?
答案 0 :(得分:35)
只有覆盖方法才有意义。
这里发生的是以下内容:
您正在覆盖基类(override
)中的方法,并告诉编译器不再允许从您的类派生的类重写此方法(sealed
)。 / p>
如果该方法是您在类中声明的新方法,并且您希望阻止派生类覆盖它,则只需将其声明为虚拟方法。
如果方法是在基类中声明但是不能覆盖它,则没有任何意义,因为它已经无法覆盖。
答案 1 :(得分:3)
我认为希尔加斯先生提供了最佳答案here
,但只是为那些在 Java (像我自己)之前有背景的程序员添加一些新内容,我认为大多数C#新手的程序员往往会将sealed
与final
混淆在Java
中有关覆盖的内容。
在 Java 中,未指定"any"
修饰符的默认行为是方法 可以 be 在其派生类中重写。
在 C#中,默认行为是方法 不能 覆盖,除非使用virtual
关键字。
希望这有助于补充上述最佳答案。
答案 2 :(得分:0)
你只能密封覆盖,所以我猜答案是肯定的。
答案 3 :(得分:0)
嗯,从技术上讲是有可能的....但是,我选择的解决方案有点脏。
想象一下,有一个类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
(即使您未进行语义更改)。