У меня был вопрос о том, как обращаться с этим типом иерархии классов. Иерархия связана с игрой, но я думаю, что она достаточно общая, чтобы перейти сюда. Я полагаю, что такие вещи случаются иногда, поэтому мне интересно узнать о возможных решениях
У меня есть базовый класс BaseCharacter, который определяет персонажа в моей игре. Он содержит все основные характеристики, держатели эффектов статуса, события и т. Д., Чтобы иметь базовый характер. Большая часть моей игровой логики работает с сущностями BaseCharacter, разыгрывая при необходимости.
Оттуда я наследую класс гуманоидов, который добавляет необходимые структуры и методы для добавления экипировки (оружие, броня и т. Д.) К персонажу, затем, наконец, у меня есть класс PlayableCharacter, который наследуется от гуманоида и добавляет такие вещи, как текущий опыт. настраиваемые структуры способностей и т. д.
Итак, структура класса просто:
BaseCharacter ---> Гуманоид ---> PlayableCharacter
Эта структура отлично подходит для определения персонажей на стороне игрока, хотя я могу решить немного улучшить структуру. Я должен иметь возможность добавлять "вражеские" классы в иерархию. Чтобы удовлетворить требования к противнику, мне нужно добавить некоторые структуры данных / методы, связанные с EXP / точками для победы над врагом, таблицами добычи и т. Д.
Проблема в том, куда мне добавить эти структуры? Добавление их в BaseCharacter кажется плохой идеей, поскольку я в основном говорю, что у каждого персонажа есть необходимые методы / структуры данных для вражеской сущности. Я подумал о том, чтобы запустить отдельный поток классов, который в итоге выглядел бы так:
BaseCharacter--->Humanoid--->PlayableCharacter
\---->Enemy--->EnemyHumanoid
где враг наследует от BaseCharacter. EnemyHumanoid добавит тот же набор методов / структур данных, что и наследование от BaseCharacter-> Humanoid. Это работает, но означает, что я не могу разыграть EnemyHumanoid в Humanoid, несмотря на то, что EnemyHumanoid удовлетворяет требованиям Humanoid. Это также добавляет избыточность, так как я хотел бы, чтобы эти два наследования добавляли один и тот же набор объектов / методов.
затем рассматривается использование отдельного класса EnemyInterface, и в итоге получается иерархия наследования, подобная этой:
BaseCharacter----->Humanoid----->PlayableCharacter
| |
V V
Enemy EnemyHumanoid
Enemy и EnemyHumanoid все реализуют EnemyInterface. Однако теперь я теряю отношения Enemy <-> EnemyHumanoid. Должен ли я использовать множественное неравномерность здесь? (есть ли в EnemyHumanoid от Enemy and Humanoid?) это считается плохой формой? Есть ли более логичный способ сделать это? Пример, приведенный здесь, довольно прост, но если я в итоге разделю иерархию классов еще больше, это станет еще сложнее.
Буду признателен за любую помощь