Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 05.04.2018, 17:51
Appleman вне форума Посмотреть профиль Отправить личное сообщение для Appleman Найти все сообщения от Appleman
  № 1  
Ответить с цитированием
Appleman
 
Аватар для Appleman

Регистрация: Dec 2014
Адрес: Санкт-Петербург
Сообщений: 479
По умолчанию Фигня с protected сеттером

Друзья, выручайте. Чтобы не устраивать проверку каждого устанавливаемого для персонажа свойства сделал в классе Character такую конструкцию:

Код AS3:
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.

Не понимаю, почему Где он тут более одного варианта увидел?
__________________
Не сломано - не чини!

Старый 05.04.2018, 18:26
Tails вне форума Посмотреть профиль Отправить личное сообщение для Tails Найти все сообщения от Tails
  № 2  
Ответить с цитированием
Tails
 
Аватар для Tails

блогер
Регистрация: Dec 2008
Адрес: г. Чебоксары
Сообщений: 2,259
Записей в блоге: 6
Что-то больно сложно всё, зачем так?
__________________
Дети не должны знать о своих родителях

Старый 05.04.2018, 18:51
Appleman вне форума Посмотреть профиль Отправить личное сообщение для Appleman Найти все сообщения от Appleman
  № 3  
Ответить с цитированием
Appleman
 
Аватар для Appleman

Регистрация: Dec 2014
Адрес: Санкт-Петербург
Сообщений: 479
Затем, что свойств прилично, требования к ним одинаковые: чтобы не было назначено повторно, чтобы не выходило за пределы шкалы и т.п. Вначале я вставлял проверку в каждый сеттер, потом понял, что это не по-православному и сделал то что сделал. Убрал внешний доступ к сеттерам и заменил на единую функцию проверки и установки свойства по его ID.

Добавлено через 21 минуту
Причём если в сеттере меняю доступ на public, всё прекрасно работает. Но теряет смысл тогда
__________________
Не сломано - не чини!

Старый 05.04.2018, 19:17
Tails вне форума Посмотреть профиль Отправить личное сообщение для Tails Найти все сообщения от Tails
  № 4  
Ответить с цитированием
Tails
 
Аватар для Tails

блогер
Регистрация: Dec 2008
Адрес: г. Чебоксары
Сообщений: 2,259
Записей в блоге: 6
Делай проще.
__________________
Дети не должны знать о своих родителях

Старый 05.04.2018, 19:26
Appleman вне форума Посмотреть профиль Отправить личное сообщение для Appleman Найти все сообщения от Appleman
  № 5  
Ответить с цитированием
Appleman
 
Аватар для Appleman

Регистрация: Dec 2014
Адрес: Санкт-Петербург
Сообщений: 479
Хм. Воистину, совет достойный китайского мудреца. А тактические идеи есть?

Если есть набор свойств, которые должны устанавливаться извне, но предварительно проверяться на соответствие некому единому перечню условий, как такое реализовать? Повторюсь, изначально в каждом сеттере стоял один и тот же код, отличавшийся только именем проверяемого свойства.
__________________
Не сломано - не чини!

Старый 05.04.2018, 19:34
Tails вне форума Посмотреть профиль Отправить личное сообщение для Tails Найти все сообщения от Tails
  № 6  
Ответить с цитированием
Tails
 
Аватар для Tails

блогер
Регистрация: Dec 2008
Адрес: г. Чебоксары
Сообщений: 2,259
Записей в блоге: 6
Просто завести статическую, публичную функцию и юзать её из сеттеров? Можно пометить как inline.
Вообще, обращаться к свойствам и методам по строковому ключу в рамках самого приложения, где всё и так известно - ну так себе идея. Теряем типизацию, проверку при компиляции, оптимизацию, получаем больше расхода памяти и цп.
__________________
Дети не должны знать о своих родителях


Последний раз редактировалось Tails; 05.04.2018 в 19:51.
Старый 05.04.2018, 20:55
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 7  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
get и set должны иметь один модификатор доступа. Если у тебя get stamina объявлен как public, то и set тоже должен быть public
__________________
Ко мне можно и нужно обращаться на ты)

Старый 05.04.2018, 22:47
Appleman вне форума Посмотреть профиль Отправить личное сообщение для Appleman Найти все сообщения от Appleman
  № 8  
Ответить с цитированием
Appleman
 
Аватар для Appleman

Регистрация: Dec 2014
Адрес: Санкт-Петербург
Сообщений: 479
caseyryan, спасибо, намотал на ус.

Цитата:
Сообщение от Tails Посмотреть сообщение
Просто завести статическую, публичную функцию и юзать её из сеттеров? Можно пометить как inline.
Вообще, обращаться к свойствам и методам по строковому ключу в рамках самого приложения, где всё и так известно - ну так себе идея. Теряем типизацию, проверку при компиляции, оптимизацию, получаем больше расхода памяти и цп.
Tails, а как иначе? Я, если честно, лучше способа пока не придумал. Если говорить о моём изначальном примере в этой ветке, с установкой значения нескольких свойств одним методом, то как-то надо передать в него указание на само свойство.

У меня так по всей программе пока сделано. Например, в классе с параметрами игровых действий ActionData может быть написано что-то типа

Код AS3:
skillID = IDs.PROP_SOCIAL; // Переменная String со значением "social"
а в классе персонажа соответственно

Код AS3:
social = 88;
И тогда в классе обработки выбранного игроком действия легко подтягиваем:

Код AS3:
var keyProp: Number = _character[_actionData.skillID];
Как бы ты подобную связь реализовал?
__________________
Не сломано - не чини!

Старый 06.04.2018, 10:33
Psycho Tiger вне форума Посмотреть профиль Отправить личное сообщение для Psycho Tiger Найти все сообщения от Psycho Tiger
  № 9  
Ответить с цитированием
Psycho Tiger
 
Аватар для Psycho Tiger

блогер
Регистрация: Jun 2005
Адрес: Господи пожалуйста не Новосибирск
Сообщений: 6,598
Записей в блоге: 17
Что нибудь вроде
Цитата:
set data(value:String) { this._data = checkValue(value); }
function checkValue(value) { if (...) throw else return value }
?

Вообще, то что ты хочешь называется метапрограмирование и в AS этого почти нет (а то что есть лучше не использовать)


Последний раз редактировалось Psycho Tiger; 09.04.2018 в 12:17.
Старый 06.04.2018, 14:18
Appleman вне форума Посмотреть профиль Отправить личное сообщение для Appleman Найти все сообщения от Appleman
  № 10  
Ответить с цитированием
Appleman
 
Аватар для Appleman

Регистрация: Dec 2014
Адрес: Санкт-Петербург
Сообщений: 479
Psycho Tiger, не понял формулировку @_data = . Можно объяснить или написать, как такая запись называется, чтобы погуглить?
__________________
Не сломано - не чини!

Создать новую тему Ответ Часовой пояс GMT +4, время: 05:40.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 05:40.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.