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
,因为您已经密封了该方法(即使您未进行语义更改)。
在下面代码的方法签名中,总是需要在sealed
关键字后加上override
:
public sealed override string Method1(){.....}
我的意思是,如果我想在基础类中“密封”该方法而不进行覆盖,是否仍然需要override
关键字?
仅在覆盖方法时才有意义。
这里发生了以下事情:您正在从基类(override
)重写方法,并告诉编译器不再允许从your类派生的类重写此方法(sealed
)。
如果该方法是您在您的类中声明的新方法,并且您想防止派生类重写它,只需不要将其声明为虚拟方法。
如果该方法在基类中声明但不是可重写的密封,则将没有任何意义,因为它已经无法被覆盖。
[我认为希尔加思先生提供了最佳答案here,但只是为在[[Java中具有较早背景的程序员(如我自己)增加一些新东西,我认为大多数C#新手都倾向于将sealed
与final
中的Java
混淆覆盖。
Java中,未指定"any"
修饰符的默认行为是方法can在其派生类中为overriden。
无法为覆盖,除非使用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
,因为您已经密封了该方法(即使您未进行语义更改)。
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
,因为您已经密封了该方法(即使您未进行语义更改)。