【发布时间】:2011-12-16 11:30:18
【问题描述】:
短版:
我将如何创建一个对象池来存储从同一个基类派生的不同类型的类?
请参阅下面的预期用法示例。
加长版:
我有一个类BaseComponent,有许多派生类,例如Child1Component, Child2Component.
我还有另一个对象表示这些组件的集合,它们的属性设置为特定值。我称之为EntityTemplate,因为实体是由一组组件及其值定义的。
我想基于实体组件创建实体。为此,目前我得到了适当的EntityTemplate,遍历它的不同组件并调用我在每个子类上定义的Clone 方法。我还在那里定义了一个Copy 方法,这可能很有用。
当一个实体过期时,我想将它的组件添加到对象池中,然后当我接下来需要创建一个实体时,我会得到实体模板,并且对于每个组件,我都会得到一个相同类型的输出并将其属性设置为等于EntityTemplate 中的属性,如下所示:
// What i want to do
var entityTemplate = GetTemplate("UniqueString");
var MyActualEntity = new Entity();
foreach(var componentTemplate in entityTemplate)
{
var actualComponent = MagicComponentPool
.GetComponentSameTypeAsParam(componentTemplate);
actualComponent.CopyFrom(componentTemplate);
MyActualEntity.Components.Add(actualComponent);
}
【问题讨论】:
-
你面临的实际问题是什么?
-
如果对象池包含 BaseClass 的列表,我如何找到我想要的 DerivedClass 实例?迭代列表会太慢。
-
为什么慢?您考虑的实例数量是多少?您的问题的答案很大程度上取决于
EntityTemplate和MagicComponentPool的内部运作。您没有描述如何识别单个组件。按类型?通过某种 ID? -
对不起,我可能没有很好地解释自己。
EntityTemplate只是一个具有字符串属性的对象,以及BaseComponent的列表。MagicComponentPool是我想要创建的。如果我给MagicComponentPool一个BaseComponent的子实例,我想取回另一个相同类型的实例,我可以愉快地使用(不影响我传入的那个)。池中可能有数百个不同子类的实例,其中许多实例可能正在使用中,然后全部同时到期。
标签: c# generics inheritance generic-collections object-pooling