为什么 abstract class 不能有 Sealed 方法

Why abstract class cannot have Sealed method

Code Snippet 1 (Compilation Error) - A.M2() cannot be sealed because it is not an override

abstract class A
{
    public abstract void M1();

    public sealed void M2()
    {
        // Do Something
    }
}

Code Snippet 2 (Works Fine)

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

密封关键字只能放在可覆盖的函数上。 您指定的该函数未声明为虚函数,因此不可覆盖。此外,将函数声明为 "virtual" 和 "sealed" 没有任何意义,因为密封取消了 "virtual"

Sealed only 可以与 "override" 关键字一起使用,并阻止其他 类 覆盖函数本身。

它与 abstract class 无关。在派生的 class.

中,您不能将方法设为密封的 class 方法

如果您打算限制它在派生 class 中被覆盖,那么您最好使用 private 访问修饰符。

以及为什么可以在派生中使用 sealed 的原因 class;我在下面有一个例子

您有三个 classes 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()
        {

        }
    }

在上面的例子中,我们可以覆盖 B class 中 A 的方法,因为它不是密封的。但是,如果您在 class C 中覆盖 B 的方法,那么由于 sealed 关键字,它是不允许的。

它将限制来自 class B 的进一步覆盖。这就是我们可以使用 sealed

的地方