为什么必须在派生class中保护抽象方法?

Why must an abstract method be protected in a derived class?

当从抽象 class 继承时,为什么抽象基 class 中受保护的抽象方法在派生的抽象 class 中被覆盖时不能是私有的?

换句话说,抽象方法是否可以由子抽象 class 定义,但孙子 class 无法访问?

考虑简化示例:

public abstract class A
{
    // This method is protected - makes sense
    protected abstract void M();
}

public abstract class B : A
{
    // Why can't this be private?
    // Compiler forces it to be protected
    // but this means grandchildren classes always have access to this method
    protected override void M()
    {
        // Do something
    }
}

public class C : B
{
    // Is it possible for M() to be inaccessible here?
}

孙子 class C 也实现了父 class A,所以这是不可能的。毕竟,在程序中,您可以将任何 C 对象转换为类型 A 的变量,并且您希望能够对其调用 M() 方法。 子 class 不实现其父的所有成员是没有意义的,无论继承层次级别如何。

由于继承的工作原理,我认为这是不可能的。所有 children(派生的 classes)都拥有 parent 所拥有的一切,加上您需要的任何额外东西。

就是说 - 如果您希望 child class 没有其 parent 具有的方法之一,您可以使用接口来实现。只需定义一个缺少您要限制的方法的接口,并让 parent 和 child 实现它。