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