4

假设我有坦克、飞机和许多其他东西的列表,它们实现的最常见的东西是 IHaveLocation 和抽象类和 IHaveColor 接口。

我想列出它们,因为我需要在这两个接口的基础上查询列表。

我该怎么做 ?

  • 我可以制作一个对象列表,然后编写 (obj as IHaveLocation) 并使用他的方法,以及 (obj as IHaveColor) 并使用他的方法。但这非常非常难看!
  • 我可以列出IhaveLocation,然后我只需要做一个(obj as IHaveColor)。但这也很可怕
  • 我可以创建一个新的抽象类,然后从两者继承,但我试图避免它。

这有什么诀窍吗?

我想做类似的东西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);

当然,缺点是您将对象存储两次。如果您不喜欢这样,那么您当然可以将列表的内部存储更改为对象或仅其中一个接口。

于 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 回答