让我说我有Tanks,Airplanes和许多其他东西的列表,他们实现的常见的东西是IHaveLocation,它是抽象类和IHaveColor这是一个接口。
我想列出它们,因为我需要在这两个接口的基础上查询列表。
我该怎么做?
这有什么诀窍吗?
我想制作类似List<IHaveLocation and IHaveColor>
答案 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);
}
}