繁体   English   中英

与 override 关联的密封关键字

[英]Sealed keyword in association with override

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

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

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

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

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

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

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

我认为 Hilgarth 先生在这里提供了最好的答案,但只是为了为以前有Java背景的程序员(比如我自己)添加一些新内容,我认为大多数 C# 新手,倾向于混淆sealedfinal in Java压倒一切。

be in its derived classes.Java中,不指定"any"修饰符的默认行为是该方法在其派生类中被

be unless explicitly specified using the virtual keyword.而在C#中,默认行为是除非使用virtual关键字明确指定,否则该方法。

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

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

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

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

好吧,这在技术上是可能的……但是,我的选择是解决方案有点脏。

想象一下有一个A类(在您的代码库或外部库中):

public class A
{
    public virtual void M () { /* implementation */ }
}

您可以定义一个(抽象)类B: A ,如下所示:

public class B : A
{
    public sealed override void M() => base.M();
}

任何类C: B都无法覆盖AM ,因为您已经密封了该方法(即使您没有进行任何语义更改)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM