1

Укороченный вариант:Один пул объектов содержат различные производные классы

Как бы я идти о создании объекта пула, который может хранить классы различных типов все производные от базового класса?
Ниже приведен пример ожидаемого использования.


Длинная версия:

У меня есть класс 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); 
} 
+0

И реальные проблемы вы сталкиваетесь? –

+0

Если пул объектов содержит список BaseClass, как мне найти экземпляр DerivedClass, который я хочу? Итерирование списка будет слишком медленным. –

+0

Зачем медленно? Какое количество случаев вы думаете? Ответ на ваш вопрос в значительной степени зависит от внутренней работы «EntityTemplate» и «MagicComponentPool». Вы не узнали, как вы узнали отдельные компоненты. По типу? По каким-то идентификаторам? –

ответ

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); 
      } 
     } 
Смежные вопросы