これは数え切れないほど直面している問題です..考えてみてください..
[public/private] interface IBase
{
void DoCore();
}
public interface IDerived_A : IBase
{
void Do_A();
}
public interface IDerived_B : IBase
{
void Do_B();
}
ここには、いくつかの一般的な機能 (IBase インターフェイスによって提供される) を提供する 2 つの便利なインターフェイスと、それらのいずれかに固有のその他の機能があります.. c# では、IBase をパブリックとして宣言する必要があります (継承インターフェイスと同じ可視性).. 、IBase インターフェイスは誰でも見ることができます..他の人がこのインターフェイスを使用する必要はありません..ppl は IDeriver_X インターフェイスにアクセスするだけで済みます..コードのユーザーから IBase インターフェイスを非表示にするにはどうすればよいですか? 私のコードには 2 種類のユーザーがいる可能性があります。
- IDerived_X にアクセスする同じ名前空間/アセンブリ内のコード..
- IDeriver_X を含むアセンブリを参照する別のプロジェクトのコード..
ps..必要以上のインターフェイスを公開するのは嫌いです(必要とは、pplが直接使用するインターフェイスのみを意味します).ps2..私はクラスで同じジレンマに直面しています..
編集:
質問が少し誤解されているように感じます..そのために、説明を投稿します..問題はインターフェイスだけに関連しているのではありません..クラスについてもバグがあります..次のコードを検討してください..
public abstract class Vehicle
{
// generic vehicle functionality
}
public Car : Vehicle
{
// functionality specific to cars
}
public Truck : Vehicle
{
// functionality specific to trucks
}
車とトラックは、私のコードのユーザーが使用できる唯一の 2 種類のオブジェクトです..仕事を簡単にし、コードの重複を避けるために、共通コードを Vehicle 抽象クラスに移動しました..しかし、それは意味しませんユーザーが車やトラックへの参照を車両変数に保存しても問題ありません..ユーザーの観点からすると、私のコードは車とトラックのみを公開する必要があります(車両やエンジン、またはコードの重複を避けるために内部で使用した基本クラスは公開しません) ..具体的には、完全な車やトラックを公開できるようにする手法を探していますが、車両やエンジンなどの他の不完全なビルディングブロックは公開できません..問題は、派生クラスがパブリックである場合、C# では基本クラスをプライベートにできないことです。 ..それはもっと理にかなっていますか?=)