繁体   English   中英

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

[英]How to make a list of something that implements abstract class and interface (C#)?

假设我有Tanks,Airplanes和许多其他东西的列表,它们实现的常见的东西是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的回答评论中提到的那样,你可以使用通用方法来添加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);

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

你可以尝试类似的东西:

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

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

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM