我有一个班级Component
和一个界面IInventoriable
。我需要一个仅包含类
示例psuedocode -
public List<Component implements IInventoriable> Inventory;
我怎样才能完成这样的事情/甚至可以在C#中实现?
更好的解决方案是子类Component
吗?对于某些上下文,我使用的是Unity等许多游戏引擎中的实体组件系统。
答案 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
并在需要时投射到组件