代码片段1(编译错误) - A.M2()无法密封,因为它不是覆盖
abstract class A
{
public abstract void M1();
public sealed void M2()
{
// Do Something
}
}
代码段2(工作正常)
abstract class A
{
public abstract void M1();
public virtual void M2()
{
}
}
class B : A
{
public sealed override void M1()
{
}
public sealed override void M2()
{
}
}
问题 - 如果我在Abstract class
本身提供方法的实现,为什么C#不允许我标记它Sealed
,为什么它要我在子类中重写,在标记为密封之后。我无法理解这种差异
答案 0 :(得分:4)
密封关键字只能放在可覆盖的功能上。 您指定的函数未声明为虚函数,因此不可覆盖。对于声明的函数也没有任何意义"虚拟"并且"密封"密封取消了"虚拟"
密封只能与"覆盖"一起使用。关键字,并阻止其他类覆盖函数本身。
答案 1 :(得分:3)
它与abstract
类无关。在派生类中使用覆盖方法之前,不能将方法设置为密封在任何类中。
如果您有意在派生类中将其限制为覆盖,那么最好使用private
访问修饰符。
你可以在派生类中使用密封的原因;我在下面举了一个例子
您有三个类A,B,C
,其中B
覆盖A
,C
来自B
- > B:A, C:B
abstract class A
{
public abstract void MyMethod();
}
class B : A
{
public sealed override void MyMethod()
{
}
}
class C : B
{
public override void MyMethod()
{
}
}
在上面的例子中,我们可以覆盖A
类中B
的方法,因为它没有被密封。但是,如果您在类B
中覆盖C
的方法,则由于密码关键字而不允许这样做。
它将限制类B
的进一步覆盖。这就是我们可以使用sealed