与重写关联的密封关键字

时间:2012-12-13 10:58:39

标签: c# override sealed

是否始终需要在以下代码的方法签名中使用sealed关键字override

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

我的意思是,如果我想在没有覆盖的情况下“密封”基类中的方法,是否还需要override关键字?

4 个答案:

答案 0 :(得分:35)

只有覆盖方法才有意义。

这里发生的是以下内容:
您正在覆盖基类(override)中的方法,并告诉编译器不再允许从您的类派生的类重写此方法(sealed)。 / p>

如果该方法是您在类中声明的新方法,并且您希望阻止派生类覆盖它,则只需将其声明为虚拟方法。

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

答案 1 :(得分:3)

我认为希尔加斯先生提供了最佳答案here ,但只是为那些在 Java (像我自己)之前有背景的程序员添加一些新内容,我认为大多数C#新手的程序员往往会将sealedfinal混淆在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(即使您未进行语义更改)。