それは不可能です、なぜですか?
C# では、パブリック メソッドを継承する場合は、それらをパブリックにする必要があります。それ以外の場合、そもそもクラスから派生しないことを期待しています。
is-a 関係を使用する代わりに、has-a 関係を使用する必要があります。
言語設計者は、継承をより適切に使用するために、意図的にこれを許可していません。
たとえば、クラス Car がクラス Engine から派生してその機能を取得すると誤って混同する場合があります。しかし、エンジンは車で使用される機能です。したがって、has-a 関係を使用する必要があります。車のユーザーは、エンジンのインターフェースにアクセスしたくありません。また、車自体がエンジンのメソッドとそれ自身のメソッドを混同してはなりません。Car の将来の派生物でもありません。
そのため、悪い継承階層から保護することは許可されていません。
代わりに何をすべきですか?
代わりに、インターフェースを実装する必要があります。これにより、has-a 関係を使用して機能を自由に使用できます。
他の言語:
C++ では、private、public、または protected の基本クラスの前に修飾子を指定するだけです。これにより、公開されていたベースのすべてのメンバーが、指定されたアクセス レベルに設定されます。C# で同じことができないのはばかげているように思えます。
再構築されたコード:
interface I
{
void C();
}
class BaseClass
{
public void A() { MessageBox.Show("A"); }
public void B() { MessageBox.Show("B"); }
}
class Derived : I
{
public void C()
{
b.A();
b.B();
}
private BaseClass b;
}
上記のクラスの名前は少し意味がないことを理解しています:)
その他の提案:
A() と B() を公開して例外をスローすることを提案する人もいます。しかし、これは人々が使いやすいクラスにはならず、あまり意味がありません。