假设我有坦克、飞机和许多其他东西的列表,它们实现的共同点是 IHaveLocation 是抽象类,而 IHaveColor 是接口(interface)。

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

我该怎么做 ?

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

  • 这有什么技巧吗?

    我想做类似 List<IHaveLocation and IHaveColor> 的东西

    最佳答案

    正如我在 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);
    

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

    10-08 09:02