[英]Sealed keyword in association with override
是否总是需要在如下代码的方法签名中跟随sealed
关键字和override
:
public sealed override string Method1(){.....}
我的意思是,如果我想在基类中“密封”方法而不覆盖,是否仍然需要override
关键字?
密封一个方法只有在你覆盖它时才有意义。
这里发生的事情如下:
您正在覆盖基类中的方法 ( override
) 并告诉编译器不再允许从您的类派生的类覆盖此方法 ( sealed
)。
如果该方法是您在您的类中声明的新方法,并且您希望防止派生类覆盖它,则不要将其声明为虚拟方法。
如果该方法是在基类中声明的,但不是可覆盖密封的,那么它就没有任何意义,因为它已经无法被覆盖。
我认为 Hilgarth 先生在这里提供了最好的答案,但只是为了为以前有Java背景的程序员(比如我自己)添加一些新内容,我认为大多数 C# 新手,倾向于混淆sealed
和final
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.