如何列出实现抽象类和接口(C#)的东西?

时间:2013-03-29 15:41:57

标签: c# generics

让我说我有Tanks,Airplanes和许多其他东西的列表,他们实现的常见的东西是IHaveLocation,它是抽象类和IHaveColor这是一个接口。

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

我该怎么做?

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

这有什么诀窍吗?

我想制作类似List<IHaveLocation and IHaveColor>

的内容

3 个答案:

答案 0 :(得分:7)

您可以将此包装在具有两种类型约束的泛型类中:

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

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

此类中的方法可以根据需要使用这两个接口,因为类型可以保证实现它们。

答案 1 :(得分:1)

正如我在Reed的回答评论中所提到的,你可以使用通用方法来添加Tank和Airplane。像这样:

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 :(得分:0)

你可以尝试类似的东西:

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

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

}