在像下面这样的方法签名中,是否总是需要在 sealed
关键字后使用 override
:
public sealed override string Method1(){.....}
我的意思是,如果我想在基类中“封装”该方法而不进行覆盖,那么是否仍需要使用override
关键字?
在像下面这样的方法签名中,是否总是需要在 sealed
关键字后使用 override
:
public sealed override string Method1(){.....}
我的意思是,如果我想在基类中“封装”该方法而不进行覆盖,那么是否仍需要使用override
关键字?
只有在你覆盖(override)它的时候,才会对封装(seal)一个方法有意义。
这里发生的是以下情况:
您正在从基类覆盖一个方法(override
),并告诉编译器从您的类派生的类不再允许覆盖此方法(sealed
)。
如果该方法是在您的类中声明的新方法,并且您想要防止派生类覆盖它,则不要将其声明为虚拟的即可。
如果该方法在基类中声明但不可重写,则对其进行封装没有任何意义,因为它已经无法被重写了。
sealed
和Java
中的final
混淆,涉及到重写部分。virtual
关键字明确指定,否则该方法不能被重写。技术上讲,这是可能的...但是,在我看来,解决方案有点不太干净。
想象一下你有一个类 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
,因为您已经封闭了该方法(即使您没有进行语义更改)。
final
关键字显式声明它们为非虚拟的。而在C#中则相反:默认情况下,方法是非虚拟的,你需要通过virtual
关键字显式声明它们为虚拟的。 - Daniel Hilgarth