2011-12-21 14 views
1
Interface A 
    { 
     string x {get;set;} 
     IEnumarable<InterfaceB> DetailList { get; set; } 
    } 
    Interface B 
    { 
    int z; 
    int y; 
    } 

    Class B :Interface B 
    { 
     implements z; 
     implements y; 
    } 
    Class A :Interface A 
    { 
     implements x; 
     IEnumarable<ClassB> DetailList {get;set;} // This line is giving trouble. 
    } 

このコードはOOの概念に違反していますか?私はInterfaceBからClassBを派生すれば、ClassBをInterfaceBの代わりにClassAで使用できると考えました。 VSはこれが好きではありません。ClassAでClassBの代わりにInterfaceBを使用するように求めています。 これを行う方法は他にありますか?私は、代替設計オプションを考慮することが喜ん他のインタフェースの要素を定義するインタフェースの実装方法

は、私は、その特性インターフェースAによって定義され、各ドメインオブジェクトは、インタフェースB 例えば コンサート(A)concertlocations(B) comedyshowによって定義されたオブジェクトに対応するであろういくつかのドメイン・オブジェクトを持っています(A)comedyshowlocations(B)

私が十分にはっきりしていないと思ったら、もっと質問してください。アドバンス


おかげ
+0

ん 'DetailList'公に設定できる必要がありますか? –

+0

はい。私はいくつかのドメインオブジェクトを持っていますが、そのオブジェクトのプロパティはインターフェイスAで定義されており、各ドメインオブジェクトには対応するオブジェクトがインターフェイスBで定義されています。 concert(A)concertlocations(B ) comedyshow(A)comedyshowlocations(B) – Neel

+1

コードはコンパイルされません。しかし、なぜこれをしたいのですか? DetailListは、ClassBインスタンスを追加する場合は、IEnum_e_rable のままです。 – CodeCaster

答えて

2

できるのは、この:

public interface InterfaceA<T> where T : InterfaceB 
{ 
    string x {get;set;} 
    IEnumerable<T> DetailList { get; set; } 
} 

public interface InterfaceB 
{ 
    int z { get; } 
    int y { get; } 
} 

public class ClassB : InterfaceB 
{ 
    public int z { get; private set; } 
    public int y { get; private set; } 
} 

public class ClassA : InterfaceA<ClassB> 
{ 
    public int z { get; private set; } 

    public string x { get; set; } 

    public IEnumerable<ClassB> DetailList {get;set;} 
} 

が、私はこれがあなたのために望ましいわかりませんか?

は、詳細はこちらをご覧ください:インターフェイス上c# interface implemention - why does this not build?

+0

これは私がやろうとしていることに対してはうまくいくでしょう。私はこれを答えにします。しかし、私のデザインに第二の考えを与える。 – Neel

2

インタフェースAは、ちょうどIEnumarable<InterfaceB> DetailList { get; set; }は、任意のクラスに存在しなければならない、それはそれのimplementaionsの1丁度InterfaceBはIEnumerableをするための一般的なタイプであることと、それを実装し、されていないことを言います。

クラスBはインターフェイスBより一般的ではないため、このように使用することはできません。

+0

私はそれを書いている間にそれが問題になると思っていました。 しかし、インターフェイスAに言及する方法は、IEnumarable DetailList {get;セット; } はInterfaceBまたはその実装ですか? – Neel

関連する問題