![]() |
Большое количество свойств — что делать?
Друзья! Уже спрашивал в "своей" теме по проектированию текстового квеста, но поскольку предыдущий ответ был моего авторства, новый вопрос "пристегнулся" следом и, по всей видимости, по этой причине остался без внимания. Задам отдельно. Если неправ по части создания новой ветки, просьба модераторам строго не судить и ветку удалить.
Вопрос следующий. В процессе работы над мини-игрой столкнулся с появлением приличного количества свойств персонажей, которые по факту существуют и используются только в данной мини-игре, и совершенно не нужны за её пределами. Пока я все эти свойства заношу в класс Character, от которого наследуются все игровые персонажи. Но чем больше новых свойств создаётся, тем больше я сомневаюсь в правильности таких действий. Как посоветуете лучше сделать: продолжать добивать такие свойства в основной класс или создать новый класс, например, CharacterBattle, куда экземпляр Character будет включён методом композиции, и уже в него добавлять нужные свойства? Чтобы экземпляр этого CharacterBattle создавался Моделью при запуске мини-игры и исчезал с её окончанием. Интересует аргументация с т.з. как расходования ресурсов, так и общепринятых правил, "хорошего тона" программирования. Спасибо. |
Конкретно в данной ситуации я думаю создание класса CharacterBattle вполне оправдано, как сущность, которая используется в рамках Battle.
|
Спасибо, wolsh, за комментарий. Будем попровать.
|
Попробовал реализовать, есть сомнения. Посмотрите фрагменты кода, плиз.
Изначально имеем классы CharacterHero и CharacterEnemy, унаследованные от общего класса Character. Поскольку в модели персонажей мини-игры есть общие свойства и методы для героя и противника, а есть специфические, создаю модели персонажей для мини-игры в похожей структуре: Код AS3:
Как итог пока нашёл решение с заданием переменных Character непосредственно в классах-наследниках, но что-то меня в этом варианте смущает. Пока правда, не понимаю, что контретно. Вот так получилось: Код AS3:
|
Код AS3:
Дело в том что компилятор то не знает, что ты запихал в свойство типа Характер ссылку на экземпляр ХарактерХеров. Он не отслеживает рантайм, он не телепат. Он видит что тип такой-то и у него нет свойства такого-то, вот и вся ошибка. Почему я не очень люблю наследование — постоянно надо кастовать, то есть объяснять компилятору, что дружить мы будем только с ХарактерХеров: Код AS3:
Добавлено через 13 минут Похоже, ты сейчас подходишь к наследованию слегка.. механически. Типа, "есть общие свойства — а соберу ка я их в суперкласс". Но не всё так просто. Надо подумать, зачем ты их собираешь в суперкласс, как это пригодится тебе в жизни (кроме очевидного неповторения строчек кода). Как они потом жить будут. Будешь ли ты использовать наследников вместо супера. А не наоборот. Наследование не дает тебе преимущества иметь переменную типа супер, запихать туда любого наследника и потом работать с ней так, как будто она наследник. Если у тебя переменная типа Характер, и в нее могут быть засунуты и Херо и Енеми, то беспрепятственно ты можешь обращаться только к тем свойствам, которые унаследованы от Характер. Иначе вообще было бы непонятно и бессмысленно называть это типизацией, если бы ты мог обращаться к типу Характер за свойствами, которых у него нет. Тебе придется создать переменную НУЖНОГО типа-наследника и перекастовать туда (то есть с проверкой) ссылку из переменной супертипа Характер. Чтобы знать ТОЧНО, что это наследник и стало быть у него есть эти свойства наследника. |
Цитата:
Цитата:
|
Цитата:
Цитата:
Переопределяй суперметоды, если это возможно. Как бы в этом смысл наследования, а не в том чтобы накидать в наследник кучу новых методов — по сути создав новый класс с ДРУГИМ интерфейсом. Если невозможно, то придется кастовать. |
Зачем ты передёргиваешь? Понятно, что есть методы суперкласса, общие для наследников, и применительно к ним мой аргумент справедлив. Мы же сравниваем с ситуацией отсутствия наследования и созданием пары абсолютно независимых классов с частично повторяющимся функционалом.
Но мысль на счёт накидывания методов в наследник я уловил, спасибо. |
| Часовой пояс GMT +4, время: 11:59. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.