与重写关联的密封关键字

Vic*_*jee 18 c# overriding sealed

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

public sealed override string Method1(){.....}
Run Code Online (Sandbox Code Playgroud)

我的意思是,如果我想在没有覆盖的情况下"密封"基类中的方法,override关键字仍然是必要的吗?

Dan*_*rth 38

只有覆盖方法才有意义.

这里发生的是:
您从基类(override)重写方法并告诉编译器不再允许从您的类派生类重写此方法(sealed).

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

如果该方法在基类中声明但是不可覆盖,那么它就没有任何意义,因为它已经无法覆盖.

  • @VictorMukherjee:如果你是宣布这种方法的人,你已经完全掌控了.如果您不希望在派生类中重写它,只需将其设置为虚拟.另见我的答案中的倒数第二段. (3认同)
  • @VictorMukherjee:是的,这是一个重要的区别:在Java中,方法是默认的虚拟,你需要通过`final`关键字将它们显式地声明为非虚拟.在C#中,它是另一种方式:默认情况下,方法是非虚拟的,您必须通过`virtual`关键字将它们显式声明为虚拟. (2认同)

Zai*_*han 5

我认为 Hilgarth 先生在这里提供了最好的答案,但只是为了为具有Java 背景的程序员(比如我自己)添加一些新内容,我认为大多数刚接触 C# 的程序员往往会在重写方面与 sealedinfinal混淆。Java

Java,不指定修饰符的默认行为是可以在其派生类中重写"any"该方法。

在C#中,默认行为是该方法不能重写,除非使用virtual关键字显式指定。

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