1

以下のコードでは、プロパティ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を返す必要があります。

より良い/一般的に使用されるパターンはありますか?

4

2 に答える 2

2

明示的なインターフェース実装を使用します。

public class Hedgehog : IHedgehog 
{
    public bool IsSquashed { get; set; }

    // your public property
    public Bristles Bristles { get; set; }

    // implements the interface
    IBristles IHedgehog.Bristles { get { return Bristles; } }
}
于 2012-11-09T09:23:30.147 に答える
0
public class Hedgehog : IHedgehog 
{
    private Bristles _bristles;

    public bool IsSquashed { get; set; }

    public IBristles Bristles 
    { 
       get {return _bristles;}
       set {_bristles = value;}
    }
}

私は考える必要があります。IHedgehogを実装するには、剛毛ではなくIBristlesを返すゲッターが必要です。

于 2012-11-08T23:19:17.147 に答える