Разве множественное наследование не решает все проблемы, которые делают системы сущностей?

10

Вопрос довольно понятен: разве множественное наследование не решает всех проблем, которые также решают системы сущностей?

Я только что вспомнил термин «множественное наследование», и это, похоже, решает множество вздутий, которые навязывает классическое наследование.

jcora
источник
1
Множественное наследование похоже на системы сущностей, но это не одно и то же. Например, несколько объектов наследования не могут иметь компоненты, добавленные и удаленные во время выполнения. Не все языки также поддерживают множественное наследование. Вы также можете считать, что композиция находится в той же категории, что и сущность / компоненты.
MichaelHouse
2
Если ваши классы уже настолько аккуратны, что вы можете легко наследовать их вместе любым удобным для вас способом, они также могут быть уже компонентами. Компоненты также позволяют составление / агрегацию во время выполнения
Ну, это более сложный и менее подвержен ошибкам, так почему же предпочитаете?
API-Beast
2
На самом деле MI также не решает проблемы «раздувания», поскольку наследование избыточного интерфейса от родительского класса или классов является скорее признаком неэффективного использования механизма наследования, а не одиночного или множественного наследования. То же самое «раздутье» может быть достигнуто и в композиционно-ориентированном подходе к проблеме.
@MrBeast Вы имеете в виду более сложный / более подверженный ошибкам, менее сложный / подверженный ошибкам или "почему бы не предпочесть?"
3Dave

Ответы:

10

Нет, множественное наследование не решает все те же проблемы, что и системы сущностей: системы сущностей и множественное наследование - это две совершенно разные вещи. Вы можете построить систему сущностей с множественным наследованием или без него, и аналогичным образом вы можете использовать множественное наследование без построения системы сущностей.

Традиционно, объектно-ориентированные системы сущностей разрабатываются из-за желания отойти от тяжелого наследования в любой форме, вместо этого стремясь к композиции . Вокруг этой пословицы имеется достаточно литературы и дискуссий, например, о программистах SE или SO , и этот более широкий вопрос о том, почему предпочтение композиции является чем-то не по теме для разработки игр. Короче говоря, однако, это подход, который имеет тенденцию давать улучшенную изменчивость и ремонтопригодность.

Сообщество
источник
2

Ответ Джоша потрясающий, но я хотел бы добавить:

Одна из самых крутых функций Entity / Component - это управляемый данными способ создания и управления каждой «вещью» в вашей игре. Из того, что я видел, когда у вас есть хорошая библиотека типов компонентов и систем, вы можете создавать практически все с минимальными изменениями кода. (Примечание: минимальный! = 0 )

Определяя свою игру с точки зрения поведения и давая себе возможность изменять эти поведения на лету - во время выполнения, во время инициализации путем загрузки их из сценария или базы данных и т. Д. - вы открываете целый мир новых возможностей. Хотите понять, почему ваши тени не приземляются там, где вы ожидаете? Добавьте камеру / POV компонент к вашему свету.

Сущность / компонент позволяет создавать все, что вы хотите, если вы создали блоки.

Кроме того, множественное наследование вызывает ту же проблему, что и одиночное наследование. Когда вы добавляете атрибут или поведение в иерархию, он распространяется. Пока вы создаете глубокие иерархии, вы будете сталкиваться с ситуациями, когда вы несете ненужный вес, дублируете код или разрешаете конфликты. Большего из этого можно избежать, когда вы представляете свою игру как данные.

Я только начал играть с этим в последние несколько недель, но я впечатлен тем, как простые вещи стали. Это не серебряная пуля - я сталкивался с несколькими случаями, когда присоединение лямбды к компоненту было самым чистым и наиболее целесообразным способом решения проблемы - но это довольно хороший пример, если вы можете так его назвать.

Слегка примечательно: один из больших, скучных генераторов обслуживания в ориентированных на данные приложениях (веб-сайты и т. Д.) Отображает иерархические объекты в реляционные базы данных. У нас есть много изящных решений, но в конечном итоге все они предназначены для сглаживания иерархий. Вместо того чтобы строить свою модель так, чтобы она соответствовала цели приложения, вы попадаете на компромисс между эффективной иерархией и логическим реляционным представлением. Я возился с идеей перестроить довольно большую иерархию в одном из моих приложений как систему сущностей / компонентов - отказаться от иерархии и сделать базу данных золотым стандартом для остальной части реализации - и это многообещающе.

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

3Dave
источник