Pull to refresh

Comments 3

Другими словами: «Composition over inheritance».

Если оружия много, и необходимо много видов одного действия (отличающихся малыми деталями), то наследование все-таки получше, т.к. можно просто перегрузить (overload) конкретно интересующий метод и все. В вашем случае придется создавать новый экземпляр компонента или рефакторить существующий компонент, что, по сути, нивелирует приемущества.
В таком случае я бы попробовал вынести детали в параметры. Допустим в игре много видов пистолетов. Все они могут использовать один и тот же класс, который реализует стрельбу. А анимацию стрельбы, эффект стрельбы, шаблон для Projectile (пуля), время задержки между выстрелами, величину разброса, количество потраченных при выстреле боеприпасов, — можно вынести в параметры класса поведения и настроить в каждом типе пистолетов отдельно.

А если отличия находятся в логике, тогда нужно рассматривать каждый случай отдельно. Я бы предпочел написать новый класс поведения. Разные классы поведения должны быть максимально независимы от друг друга, чтобы изменения в одном не меняли поведение других классов. Хотя в ряде случаем возможно допустимо наследование, главное не увлекаться.
Шило на мыло поменяли :)

Плюс такого подхода в том, что если для нового вида оружия требуется новое поведение, мы не переписываем BaseGun


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

Более того, как написали выше, что бы поменять у экшена какую-то мелочь, нужно создавать отдельный класс, либо лезть в общий и добавлять туда переменные, что опять же противоречит вашим словам о том, что этого не нужно делать по сравнению с наследованием…

Ну и в довесок можно сказать, что вам все равно придется наследовать пушки, хотя бы изходя из того, что вам нужен один класс «Оружие», с которым будет работать менеджер оружия или интерфейс, например. Ну и хранить какой-то общий функционал для всего оружия… А наследование + компоненты это не очень удобно…

Плюсы такой системы определнно есть, но не в вашем случае) Например это удобно делать, когда нужно совсем разным объектам придать общий функционал, вроде взаимодействия, включения/выключения… Или же когда нужно динамические компоненты с функционалом добавлять, вроде тех же экшенов, но в другой форме.
Sign up to leave a comment.

Articles