web-dev-qa-db-ja.com

一貫性のないアクセシビリティ:基本クラスはクラスよりもアクセスしにくい

DLLとそのクラスの子クラスに抽象的な基本クラスがあります。子をパブリックにしたいが、ベースをプライベートにして、dllの外部にアクセスできないようにしたい。

それ、どうやったら出来るの?

18
Ivan Prodanov

できないしできない。

クラスをpublicとして公開する場合、基本タイプmustpublicになります。もう1つのオプションは、public interface、およびinterfaceを介してのみ型を公開します(おそらくインスタンスを作成するためのどこかでファクトリメソッドを使用します)。

最後のオプションの1つは、基本クラスを継承するのではなく、カプセル化することです。

29
Marc Gravell

publicにして、すべてのコンストラクターをinternalにします(デフォルトのコンストラクターを使用している場合は、パラメーターなしのコンストラクターを追加してオーバーライドします)。

その後、公開され、封印されていませんが、外部コードによってサブクラス化することはできません。

14
Jon Hanna

@Marc Gravelの回答のコメントで私が言っていたことを明確にするためにあなたcould

public ChildClass : ParentClass
{

}

public ParentClass
{
   internal void MethodIdontWantToExpose()
  {

  }

}

とはいえ、interfaceはおそらく最良のソリューションです

1
Liam