![]() |
Вопрос про наследование и State
Друзья!
У меня в архитектуре предусмотрены методы, переопределяемые для персонажа игрока и NPC. Это реализовано через наследование: классы CharacterPlayer и CharatcterNPC расширяют общий базовый Character. Также у Character некоторые методы работают по-разному в зависимости от того, находится он в "обычном" или "боевом" режиме. Реализовано через паттерн проектирования "Состояние" (State). В частности, создан класс ChState и его наследники ChStateNormal и ChStateBattle. Экземпляр текущего состояния получает в конструктор ссылку на персонажа-владельца и записывается у него в переменную _state, через которую вызываются все различающиеся методы. Всё как в книжке. Теперь вопрос. Что мне делать, если вызываемая версия метода зависит одновременно и от наследника Character (игрок/NPC), и от текущего состояния (Normal/Battle)? |
Ты всегда можешь в коде проверить, какое именно состояние или персонаж у тебя используются, например:
Код AS3:
|
по-моему паттерны подобного рода были придуманы специально, чтобы не делать таких вот проверок...
|
Всё равно тебе придётся узнать в каком режиме находится стейт.
Можно сделать и так: Код AS3:
Код AS3:
Код AS3:
|
Цитата:
Цитата:
|
Главное не заработай себе болезнь паттернов. То что ты делаешь сейчас скорее всего большее зло чем просто добавить проверку.
|
Цитата:
У состояния есть ссылка на персонажа. Состояние знает, что у персонажа есть какой-то метод. Этот метод вызывается. Профит. Состояние Battle вызывает метод hit(), состояние нормал вызывает метод fuckAbout(). Какая состоянию разница что делается внутри этого метода? Мне кажется, что иногда ты создаешь тему сразу же, как что-то не понял. Даже не успев подумать а есть ли вообще проблема |
caseyryan, на счёт последнего ты не прав. Напротив, с понедельника крутил в голове. Здесь скорее зашоренность: прочитал в книжке, как методы реализуются ВНУТРИ классов-состояний и ни шагу в сторону. Спасибо за совет!
Скажи ещё, как по-твоему, если состояния действительно имеют ссылку на своего владельца, как вообще лучше делать: реализовывать что-то в состояниях, или использовать их как классы-"стрелочники", которые дёргают нужные методы владельцев, а сами ничего не делают? |
Цитата:
В то же время, если состояние для каждого вида врагов будет содержать какую-то вшитую логику, то это тоже гибкости не придает. Поэтому, я бы на твоем месте остановился на варианте с константами. Но это мое имхо, решать как делать всё равно тебе |
caseyryan, я наоборот с этого начал и потом ушёл, т.к. слишком раскидистой начала становиться реализация подобной логики. Состояние по факту оказалось достаточно комплексной штукой, влияющей на многие вещи. Это в данном конкретном случае потребовалось дёргать методы.
|
| Часовой пояс GMT +4, время: 21:28. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.