以下のコードでは、プロパティBristles of HedgehogをIHedgehogインターフェイスのIBristlesとして公開したいと思います。これは、a)ゲッターを公開するだけで、b)外部アセンブリですべてのアセンブリを参照する必要がないためです。 Bristlesは、FindBristleDNAのようなより複雑なメソッドに使用します。これは、直感的にそれを行う正しい方法のように思われるものです。
// straightforward interface for simple properties of Bristles --
// more complicated methods not exposed
public interface IBristles {
int Quantity{ get; }
}
public class Bristles : IBristles {
public int Quantity{ get; set; }
public MyObscureAssembly.ComplicatedObject FindBristleDNA(){ ... }
}
// simple interface for Hedgehog, which in turn exposes IBristles
public interface IHedgehog {
bool IsSquashed { get; }
IBristles Bristles { get; }
}
// Here, Hedgehog does not properly implement IHedgehog, even though
// Bristles implement IBristles. Will not compile.
public class Hedgehog : IHedgehog {
public bool IsSquashed { get; set; }
public Bristles Bristles { get; set; }
}
私の選択は、IHedgehogインターフェイスでBristlesを直接公開するか(これは実行したくない)、または別の名前で別のプロパティを作成する(これも実際には実行したくないので、IHedgehogにIBristlesがプロパティIsSquashedを持っているのと同じように、プロパティBristlesを持っています。)
public interface IHedgehog {
bool IsSquashed { get; }
IBristles ReadOnlyBristles { get; }
}
public class Bar : IBar {
public bool IsSquashed { get; set; }
public Bristles Bristles { get; set; }
public IBristles ReadOnlyBristles { get { return this.Bristles; }
}
これはかなりエレガントではないようです。
もちろん、実際のHedgehogオブジェクトを処理するときは、getterとsetterが完全に機能し、返されるオブジェクトが適切なBristlesオブジェクトである必要があります。ただし、IHedgehogは、BristlesゲッターからIBristlesを返す必要があります。
より良い/一般的に使用されるパターンはありますか?