Просмотр полной версии : Фигня с protected сеттером
Appleman
05.04.2018, 17:51
Друзья, выручайте. Чтобы не устраивать проверку каждого устанавливаемого для персонажа свойства сделал в классе Character такую конструкцию:
public function setCharacterStaticProp(propID: String, value: Number) : void
{
if (this[propID]) throw ("Character -> setCharacterStaticProp: Данное свойство не может быть изменено в процессе игры");
// другие проверки
this[propID] = value;
}
protected function set stamina(value: uint) : void {_stamina = value } // Выносливость
public function get stamina() : uint {return _stamina } // Выносливость
При попытке запустить _character.setCharacterStaticProp("stamina"); получаю в рантайме: [Fault] exception, information=TypeError: Error #1008: stamina is ambiguous; Found more than one matching binding.
Не понимаю, почему :( Где он тут более одного варианта увидел?
Что-то больно сложно всё, зачем так?
Appleman
05.04.2018, 18:51
Затем, что свойств прилично, требования к ним одинаковые: чтобы не было назначено повторно, чтобы не выходило за пределы шкалы и т.п. Вначале я вставлял проверку в каждый сеттер, потом понял, что это не по-православному и сделал то что сделал. Убрал внешний доступ к сеттерам и заменил на единую функцию проверки и установки свойства по его ID.
Добавлено через 21 минуту
Причём если в сеттере меняю доступ на public, всё прекрасно работает. Но теряет смысл тогда :(
Appleman
05.04.2018, 19:26
Хм. Воистину, совет достойный китайского мудреца. :) А тактические идеи есть?
Если есть набор свойств, которые должны устанавливаться извне, но предварительно проверяться на соответствие некому единому перечню условий, как такое реализовать? Повторюсь, изначально в каждом сеттере стоял один и тот же код, отличавшийся только именем проверяемого свойства.
Просто завести статическую, публичную функцию и юзать её из сеттеров? Можно пометить как inline.
Вообще, обращаться к свойствам и методам по строковому ключу в рамках самого приложения, где всё и так известно - ну так себе идея. Теряем типизацию, проверку при компиляции, оптимизацию, получаем больше расхода памяти и цп.
caseyryan
05.04.2018, 20:55
get и set должны иметь один модификатор доступа. Если у тебя get stamina объявлен как public, то и set тоже должен быть public
Appleman
05.04.2018, 22:47
caseyryan, спасибо, намотал на ус.
Просто завести статическую, публичную функцию и юзать её из сеттеров? Можно пометить как inline.
Вообще, обращаться к свойствам и методам по строковому ключу в рамках самого приложения, где всё и так известно - ну так себе идея. Теряем типизацию, проверку при компиляции, оптимизацию, получаем больше расхода памяти и цп.
Tails, а как иначе? Я, если честно, лучше способа пока не придумал. Если говорить о моём изначальном примере в этой ветке, с установкой значения нескольких свойств одним методом, то как-то надо передать в него указание на само свойство.
У меня так по всей программе пока сделано. Например, в классе с параметрами игровых действий ActionData может быть написано что-то типа
skillID = IDs.PROP_SOCIAL; // Переменная String со значением "social"
а в классе персонажа соответственно
social = 88;
И тогда в классе обработки выбранного игроком действия легко подтягиваем:
var keyProp: Number = _character[_actionData.skillID];
Как бы ты подобную связь реализовал?
Psycho Tiger
06.04.2018, 10:33
Что нибудь вроде
set data(value:String) { this._data = checkValue(value); }
function checkValue(value) { if (...) throw else return value }
?
Вообще, то что ты хочешь называется метапрограмирование и в AS этого почти нет (а то что есть лучше не использовать)
Appleman
06.04.2018, 14:18
Psycho Tiger, не понял формулировку @_data = . Можно объяснить или написать, как такая запись называется, чтобы погуглить?
ZergMaster
06.04.2018, 18:19
public function setCharacterStaticProp(propID: String, value: Number) : void
{
if (this[propID]) throw ("Character -> setCharacterStaticProp: Данное свойство не может быть изменено в процессе игры");
// другие проверки
this[propID] = value;
}
protected function set stamina(value: uint) : void {_stamina = value } // Выносливость
public function get stamina() : uint {return _stamina } // Выносливость
а потом, при изучении данного кода, если мы попросим IDE найти все использования set staminа, чтобы узнать, где мы её определяем, то ide укажет нам что, черт его подери, НИГДЕ! Замечательно. Великолепно. После небольшого батхерта и некоторого плясания с бубном мы таки обнаружим метод setCharacterStaticProp. Когда же мы поищем юзания его... то на нас вывалится 100500 его использований с разными строками... Сиди, разгребай. А что, главное, что автору понятно. По крайней мере, первые пол года. Если повезет.
Appleman
07.04.2018, 13:27
ZergMaster, память - стержень интеллекта!
Psycho Tiger
09.04.2018, 12:18
Psycho Tiger, не понял формулировку @_data = . Можно объяснить или написать, как такая запись называется, чтобы погуглить?
Упс, извиняюсь, я совсем давно не писал на AS и совсем забыл как присваивать поля класса :D
В моей голове `@_data` = `this._data`
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.