1

简洁版本:

我将如何创建一个对象池来存储从同一个基类派生的不同类型的类?
有关预期用法的示例,请参见下文。


长版:

我有一个类BaseComponent,有许多派生类Child1Component,例如Child2Component.

我还有另一个对象表示这些组件的集合,它们的属性设置为特定值。我称之为 an 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);
}
4

1 回答 1

1

我会用字典。

Dictionary<Type, BaseComponent> dictionary = new Dictionary<Type, BaseComponent>();

像这样放入原始组件:

dictionary.Add(component.GetType(), component);

并按类型检索它们。

BaseComponent component = dictionary[componentTemplate.GetType()];

无论字典中有多少对象,从字典中检索对象的复杂性都是恒定的,并且等于计算键哈希的成本。

但是,我不确定这是否适用于您的目的,但是由于您无论如何都在复制对象,为什么不直接从模板中克隆组件,甚至克隆整个模板。

这是一个通用的克隆方法:

using System.IO;
using System.Runtime.Serialization.Formatters.Binary;

        public static T Clone<T>(T o)
        {
            byte[] bytes = SerializeBinary(o);
            return DeserializeBinary<T>(bytes);
        }

        public static byte[] SerializeBinary(object o)
        {
            if (o == null) return null;
            BinaryFormatter bf = new BinaryFormatter();
            using (MemoryStream ms = new MemoryStream())
            {
                bf.Serialize(ms, o);
                return ms.GetBuffer();
            }
        }

        public static T DeserializeBinary<T>(byte[] bytes)
        {
            if (bytes == null) return default(T);
            BinaryFormatter bf = new BinaryFormatter();
            using (MemoryStream ms = new MemoryStream(bytes))
            {
                return (T) bf.Deserialize(ms);
            }
        }
于 2011-12-16T16:44:04.947 回答