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

本文关键字:接口 何列出 实现 抽象类 | 更新日期: 2023-09-27 18:06:25

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

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

我该怎么做呢?

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

有什么诀窍吗?

我想创建List<IHaveLocation and IHaveColor>

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

你可以把它包装在一个对两种类型都有约束的泛型类中:

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);
    }
}