1

短縮版:

同じ基本クラスから派生したさまざまな型のクラスを格納できるオブジェクト プールを作成するにはどうすればよいでしょうか。
想定される使用例については、以下を参照してください。


長いバージョン:

私はBaseComponent多くの派生クラスをChild1Component持つクラスを持っていChild2Componentます。

これらのコンポーネントのコレクションを表す別のオブジェクトもあり、そのプロパティは特定の値に設定されています。EntityTemplateエンティティは一連のコンポーネントとその値によって定義されるため、これを と呼びます。

エンティティ コンポーネントに基づいてエンティティを作成したいと考えています。現在これを行うには、適切な を取得し、EntityTemplateさまざまなコンポーネントをループして、Clone各子クラスで定義したメソッドを呼び出します。そこにもCopyメソッドが定義されていますが、これは役に立つかもしれません。

エンティティの有効期限が切れたら、そのコンポーネントをオブジェクト プールに追加します。次にエンティティを作成する必要があるときは、エンティティ テンプレートを取得し、コンポーネントごとにプールから同じタイプの 1 つを取得します。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()];

ディクショナリからオブジェクトを取得する複雑さは、ディクショナリに含まれるオブジェクトの数に関係なく一定であり、キーのハッシュを計算するコストと同じです。

ただし、それがあなたの目的に当てはまるかどうかはわかりませんが、とにかくオブジェクトをコピーしているので、テンプレートからコンポーネントを複製したり、テンプレート全体を複製したりしないでください。

一般的な Clone メソッドを次に示します。

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 に答える