拥有实现接口的某个类的列表

时间:2016-08-06 14:39:54

标签: c# generics

我有一个班级Component和一个界面IInventoriable。我需要一个仅包含的对象列表,并实现IInventoriable接口,类似于this answer in Java

示例psuedocode -

public List<Component implements IInventoriable> Inventory;

我怎样才能完成这样的事情/甚至可以在C#中实现?

更好的解决方案是子类Component吗?对于某些上下文,我使用的是Unity等许多游戏引擎中的实体组件系统。

2 个答案:

答案 0 :(得分:3)

填充列表时,您可以尝试使用linq List<Component>。列表可以是Inventory.OfType<IInventoriable>(),但在填充或过滤列表时,您可以使用linq扩展名Component,它只返回同时实现IInventoriable的{​​{1}}派生对象

使用这些约束创建自己的List派生泛型类

public class InventoriableComponentList<T> : System.Collections.Generic.List<T>
    where T : Component, IInventoriable {

    public InventoriableComponentList()
        : base {

    }

    public InventoriableComponentList(IEnumerable<T> collection)
        : base(collection) {

    }
}

答案 1 :(得分:2)

如果没有类型参数,我认为这是不可能的。使用类型参数,您可以执行类似

的操作
FrigoriferoClass

你可以给你的类一个带有该约束的类型参数,然后它将永远是pdf,但是你必须弄清楚如何设置它,如果没有其他类型,这可能是不可能的param,然后另一个......

但是还有其他一些选择:

  • int Method<T>(List<T> inventory) where T : Component, IInventoriable { ... } 功能与组件分开。例如,make Component implements IInventoriable个对象具有实例变量IInventoriable,即Component。如果组件不可清,则inventoryItem将为IInventoriable。然后列出这些inventoryItem而不是组件列表
  • null设为界面,并设置inventoryItem界面Component
  • 如果您不打算使用IInventoriable功能,只需拥有implement
  • 如果您完全知道所有Component个对象都必须是List<IInventoriable>,请执行运行时检查;拥有IInventoriable并在需要时投射到组件