如何列出实现抽象类和接口的东西(c#)
本文关键字:接口 何列出 实现 抽象类 | 更新日期: 2023-09-27 18:06:25
假设我有坦克,飞机和许多其他东西的列表,他们实现的最常见的东西是IHaveLocation这是一个抽象类和IHaveColor这是一个接口。
我想把它们列成一个列表,因为我需要在这两个接口的基础上查询列表。
我该怎么做呢?
- 我可以做一个对象列表,然后写(obj作为IHaveLocation)并使用他的方法,和(obj作为IHaveColor)并使用他的方法。但这是非常非常丑陋的!
- 我可以使IhaveLocation的列表,然后我只需要做一个作为(obj作为IHaveColor)。但也很糟糕
- 我可以创建一个新的抽象类,然后从两者继承,但我试图避免它。
有什么诀窍吗?
我想创建List<IHaveLocation and IHaveColor>
你可以把它包装在一个对两种类型都有约束的泛型类中:
public class YourClass<T> where T : IHaveLocation, IHaveColor
{
List<T> items = new List<T>;
public void Add(T item)
{
items.Add(item);
}
// ...
}
该类中的方法可以根据需要使用这两个接口,因为该类型保证实现它们。
正如我在Reed回答的评论中提到的,您可以使用泛型方法来允许您添加坦克和飞机。像这样:
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);
当然,缺点是要存储对象两次。如果您不喜欢这样,那么当然可以将列表的内部存储更改为对象或仅其中一个接口。
你可以尝试这样做:
public class YourClass<T> where T : Ihavelocation, ihavecolor{
List<T> items = new List<T>;
public void Add(T item){
items.Add(item);
}
}