2016-12-31 12 views
1

私はここに、この記事のタイトルは非常によく私の問題を説明していないかもしれないと思うが、うまくいけば、それは少し良く説明しなければならないいくつかのコードです:子クラスがその親としてリストに格納されている場合、その子クラスのインターフェースプロパティにどのようにアクセスできますか?

interface IFoo { 
    IFoo Bar {get; set;} 
} 

class Parent { 

} 

class Child1 : Parent, IFoo { 

} 

class Child2 : Parent, IFoo { 

} 

class Manager { 
    List<Parent> Parents = new List<Parent>(); 

    Parents.Add(new Child1()); 
    Parents.Add(new Child2()); 

    // I want to do something like this: 
    Parents[0].Bar = Parents[1]; 
} 

私は(Parents[0] is IFoo)trueとして評価され、そしてまだ私ができると信じてParentにはBarの定義が含まれていないため、Parents[0].Barを使用しないでください。なぜこれが説明できるのですか?また、私はどのように効果的に(少なくとも私の頭の中で)Parents[0].Bar = Parents[1]と同じことをすることができますか?

これはうまくいけばうまくいきます。私は必要に応じて事を明確にしようとします。見ていただきありがとうございます!

答えて

0

使用タイプキャスト:

((IFoo)Parents[0]).Bar 

しかし、あなたがinplementationに依存している場合、実際にそれはあなたのケースで悪いデザインです。

0

割り当てを行う場合は、自分のコードと同じ情報と、Managerクラスと同じ情報をコードに持たせる必要があります。

abstract class Parent : IFoo 
{ 
    public abstract IFoo Bar { get; set; } 
} 

それは今もあなたが一人で親をインスタンス化することはできませんと述べている:あなたはそれがIFooについて知っていることをクラスの親に伝える必要があり、それが意味することを意味し 。あなたのコメントから、それは理にかなっているようです(あなたは親がBarの実装を持たず、知っているだけであると言っています)。それが理にかなっていれば抽象的ですが、要約を削除せずにBar to Parentの実装を追加するか、実際の実装が各子ごとに異なる場合は仮想化してください。

関連する問題