4

タンク、飛行機、およびそれらが実装する他の多くのもののリストがあるとしましょう。それらが実装する一般的なものは、抽象クラスである IHaveLocation とインターフェースである IHaveColor です。

この2つのインターフェースに基づいてリストを照会する必要があるため、それらのリストを作成したいと思います。

どうすればいいのですか ?

  • オブジェクトのリストを作成し、(IHaveLocation として obj) を記述して彼のメソッドを使用し、(IHaveColor として obj) を記述して彼のメソッドを使用できます。しかし、これは非常に醜いです!
  • IhaveLocation のリストを作成できます。次に、1 つだけ (IHaveColor としての obj) を実行する必要があります。でもそれもひどい
  • 新しい抽象クラスを作成して両方から継承することはできますが、それを避けようとしています。

これにはいくつかのトリックがありますか?

のようなものを作りたいList<IHaveLocation and IHaveColor>

4

3 に答える 3

8

これを、両方の型に制約のあるジェネリック クラスでラップできます。

public class YourClass<T> where T : IHaveLocation, IHaveColor
{
    List<T> items = new List<T>;

    public void Add(T item)
    {
        items.Add(item);
    }
    // ...
}

このクラス内のメソッドは、型がそれらを実装することが保証されているため、必要に応じて両方のインターフェイスを使用できます。

于 2013-03-29T15:44:08.130 に答える
1

リードの回答のコメントで述べたように、一般的な方法を使用して、タンクと飛行機の両方を追加できます。このようなもの:

class TwoTypesList<T1, T2>
{
    List<Tuple<T1, T2>> m_list = new List<Tuple<T1,T2>>();

    public void Add<ConcreteT>(ConcreteT item) where ConcreteT : T1, T2
    {
        m_list.Add(Tuple.Create<T1, T2>(item, item));
    }
}

次に、使用法は次のようになります。

        TwoTypesList<IHaveColor, IHaveLocation> list = new TwoTypesList<IHaveColor, IHaveLocation>();
        Airplane a = new Airplane();
        Tank t = new Tank();
        list.Add(a);
        list.Add(t);

もちろん、欠点は、オブジェクトを 2 回保存することです。それが気に入らない場合は、もちろん、リストの内部ストレージをオブジェクトまたはインターフェイスの 1 つだけに変更できます。

于 2013-03-29T18:47:23.033 に答える
0

次のようなものを試すことができます:

public class YourClass<T> where T : Ihavelocation, ihavecolor{
    List<T> items = new List<T>;

    public void Add(T item){
        items.Add(item);
    }

}
于 2013-03-29T15:45:14.767 に答える