|
|
|||||
Регистрация: Dec 2014
Адрес: Санкт-Петербург
Сообщений: 479
|
Вопрос про наследование и State
Друзья!
У меня в архитектуре предусмотрены методы, переопределяемые для персонажа игрока и NPC. Это реализовано через наследование: классы CharacterPlayer и CharatcterNPC расширяют общий базовый Character. Также у Character некоторые методы работают по-разному в зависимости от того, находится он в "обычном" или "боевом" режиме. Реализовано через паттерн проектирования "Состояние" (State). В частности, создан класс ChState и его наследники ChStateNormal и ChStateBattle. Экземпляр текущего состояния получает в конструктор ссылку на персонажа-владельца и записывается у него в переменную _state, через которую вызываются все различающиеся методы. Всё как в книжке. Теперь вопрос. Что мне делать, если вызываемая версия метода зависит одновременно и от наследника Character (игрок/NPC), и от текущего состояния (Normal/Battle)?
__________________
Не сломано - не чини! |
|
|||||
Ты всегда можешь в коде проверить, какое именно состояние или персонаж у тебя используются, например:
__________________
if (love is true) break my.heart; |
|
|||||
по-моему паттерны подобного рода были придуманы специально, чтобы не делать таких вот проверок...
__________________
местонахождение |
|
|||||
Всё равно тебе придётся узнать в каком режиме находится стейт.
Можно сделать и так: class State{ public static const NORMAL:String = "normal"; public static const BATTLE:String = "battle"; function getStateType():String { return NORMAL; } } И проверять в коде: Но я не вижу принципиально разницы, если все твои последующие стейты ты будешь наследовать от ChStateNormal или ChStateBattle
__________________
if (love is true) break my.heart; |
|
|||||
Регистрация: Dec 2014
Адрес: Санкт-Петербург
Сообщений: 479
|
Вовсе нет. Как отметил СлаваRa, суть самого паттерна "Состояние" в том и состоит, что проверять ничего не нужно. Ты просто записываешь в переменную _state того или иного наследника базового класса (или интерфейса) состояния и переопределяешь в нём методы. Получается, что вместо doSomething(), ты запускаешь _state.doSometing(). По факту запустится метод из актуального на данный момент состояния.
Цитата:
__________________
Не сломано - не чини! |
|
|||||
Главное не заработай себе болезнь паттернов. То что ты делаешь сейчас скорее всего большее зло чем просто добавить проверку.
__________________
if (love is true) break my.heart; |
|
|||||
Цитата:
У состояния есть ссылка на персонажа. Состояние знает, что у персонажа есть какой-то метод. Этот метод вызывается. Профит. Состояние Battle вызывает метод hit(), состояние нормал вызывает метод fuckAbout(). Какая состоянию разница что делается внутри этого метода? Мне кажется, что иногда ты создаешь тему сразу же, как что-то не понял. Даже не успев подумать а есть ли вообще проблема
__________________
Ко мне можно и нужно обращаться на ты) |
|
|||||
Регистрация: Dec 2014
Адрес: Санкт-Петербург
Сообщений: 479
|
caseyryan, на счёт последнего ты не прав. Напротив, с понедельника крутил в голове. Здесь скорее зашоренность: прочитал в книжке, как методы реализуются ВНУТРИ классов-состояний и ни шагу в сторону. Спасибо за совет!
Скажи ещё, как по-твоему, если состояния действительно имеют ссылку на своего владельца, как вообще лучше делать: реализовывать что-то в состояниях, или использовать их как классы-"стрелочники", которые дёргают нужные методы владельцев, а сами ничего не делают?
__________________
Не сломано - не чини! |
|
|||||
Цитата:
В то же время, если состояние для каждого вида врагов будет содержать какую-то вшитую логику, то это тоже гибкости не придает. Поэтому, я бы на твоем месте остановился на варианте с константами. Но это мое имхо, решать как делать всё равно тебе
__________________
Ко мне можно и нужно обращаться на ты) |
|
|||||
Регистрация: Dec 2014
Адрес: Санкт-Петербург
Сообщений: 479
|
caseyryan, я наоборот с этого начал и потом ушёл, т.к. слишком раскидистой начала становиться реализация подобной логики. Состояние по факту оказалось достаточно комплексной штукой, влияющей на многие вещи. Это в данном конкретном случае потребовалось дёргать методы.
__________________
Не сломано - не чини! |
Часовой пояс GMT +4, время: 02:09. |
|
« Предыдущая тема | Следующая тема » |
|
|