为什么必须在派生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 实现它。
当从抽象 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 实现它。