与覆盖相关的密封关键字

问题描述 投票:22回答:4

在下面代码的方法签名中,总是需要在sealed关键字后加上override

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

我的意思是,如果我想在基础类中“密封”该方法而不进行覆盖,是否仍然需要override关键字?

c# overriding sealed
4个回答
40
投票

仅在覆盖方法时才有意义。

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

如果该方法是您在您的类中声明的新方法,并且您想防止派生类重写它,只需不要将其声明为虚拟方法。

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


3
投票

[我认为希尔加思先生提供了最佳答案here,但只是为在[[Java中具有较早背景的程序员(如我自己)增加一些新东西,我认为大多数C#新手都倾向于将sealedfinal中的Java混淆覆盖。

Java中,未指定"any"修饰符的默认行为是方法can在其派生类中为overriden

尽管在[[C#中,默认行为是方法[[

无法为覆盖,除非使用virtual关键字明确指定。

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

1
投票

嗯,从技术上讲是有可能的....但是,我选择的解决方案有点脏。

想象一下,有一个类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,因为您已经密封了该方法(即使您未进行语义更改)。

0
投票
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,因为您已经密封了该方法(即使您未进行语义更改)。
© www.soinside.com 2019 - 2024. All rights reserved.