为什么抽象类不能有Sealed方法

时间:2018-06-19 06:14:32

标签: c# oop abstract-class sealed

  

代码片段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,为什么它要我在子类中重写,在标记为密封之后。我无法理解这种差异

2 个答案:

答案 0 :(得分:4)

密封关键字只能放在可覆盖的功能上。 您指定的函数未声明为虚函数,因此不可覆盖。对于声明的函数也没有任何意义"虚拟"并且"密封"密封取消了"虚拟"

密封只能与"覆盖"一起使用。关键字,并阻止其他类覆盖函数本身。

答案 1 :(得分:3)

它与abstract类无关。在派生类中使用覆盖方法之前,不能将方法设置为密封在任何类中。

如果您有意在派生类中将其限制为覆盖,那么最好使用private访问修饰符。

你可以在派生类中使用密封的原因;我在下面举了一个例子

您有三个类A,B,C,其中B覆盖AC来自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

的地方