о парадигме компонента сущности

Я делаю немного IDE и во время программирования я сталкиваюсь с небольшой трудностью, которую пытаюсь объяснить.
У меня два слоя (cpp файлы), один для объектов более низкого уровня (сам объект, вектор и т. д.) и один для более высокого уровня ( IDE уровень, как кнопки и т. д.):

в entities.h

struct EntityComponent{
};

struct a_component : EntityComponent{  //cannot change this
};

struct Entity{
... //entity data like childs, parent, transforms, and so on

std::vector<EntityComponent*> components;
};

в ide.h

struct GuiButton{...};
struct GuiProperty{...};

Теперь я хочу, чтобы каждая сущность и каждый компонент брали указатель на более высокий тип, объявленный в слое ide.h, например элемент gui для рисования данных сущности или компонента, поэтому я сделал:

в ide.h

struct EditorEntity : Entity{
GuiProperty* properties;
};

struct EditorEntityComponent: EntityComponent{
GuiProperty* properties;
};

я могу использовать EditorEntity в IDE вместо сущности и использовать свойства.
Проблема возникает, когда я хочу сделать то же самое с EntityComponent структура: каждый компонент в нижнем слое объявляется наследующим EntityComponent структура, поэтому я не могу изменить это значение, потому что статически объявляется в каждом определении компонента.

мне нужно EditorEntityComponent : EntityComponent который содержит более высокий тип свойства, но я не хочу размещать уродливый указатель в EntityComponent магнезии.
Любая помощь?

0

Решение

Вы говорите о «композитном» дизайне шаблона https://en.wikipedia.org/wiki/Composite_pattern

Пример в знаменитой книге «Шаблоны проектирования» (Гамма, Хелм, Джонсон и Влиссидес) на самом деле представляет собой графический редактор, именно для которого вы пытаетесь его использовать. Если вы можете овладеть этим, прочитайте эту главу.

Даже если следовать хорошо известным правилам, есть много способов сделать что-то. То, что следует, полностью мое собственное мнение:

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

Вместо этого вы можете контролировать, какие компоненты разрешены для каждого класса, возлагая на него ответственность за их создание. Если ваш редактор сущностей создает каждый из своих компонентов редактора сущностей, то никакой другой класс никогда не сможет присвоить ему неправильный тип.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]