26

是否总是需要在方法的签名中跟随sealed关键字 with override,如下面的代码:

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

我的意思是,如果我想在不覆盖的情况下“密封”基类中的方法,那么override关键字是否仍然必要?

4

4 回答 4

46

密封一个方法只有在你覆盖它时才有意义。

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

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

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

于 2012-12-13T11:00:16.330 回答
4

我认为 Hilgarth 先生在这里提供了最好的答案 ,但只是为了给以前有Java背景的程序员(比如我自己)添加一些新东西,我认为大多数 C# 新手在覆盖方面 往往会sealed混淆。finalJava

Java"any"中,没有指定修饰符的默认行为是可以在其派生类中覆盖该方法。

C#中,默认行为是除非使用关键字明确指定,否则无法覆盖该方法。virtual

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

于 2016-07-13T15:38:04.343 回答
1

你只能密封一个覆盖,所以我想答案是肯定的。

于 2012-12-13T11:00:05.410 回答
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,因为您已经密封了该方法(即使您没有进行语义更改)。

于 2020-05-03T18:06:48.013 回答