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

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

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

Регистрация: Oct 2006
Сообщений: 2,283
Код AS3:
Это как раз приватизация конструктора так сказать)
в чем смысл наличия флага isConstructing?

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

Регистрация: May 2008
Адрес: Питер
Сообщений: 385
Отправить сообщение для ZergMaster с помощью ICQ Отправить сообщение для ZergMaster с помощью Skype™
Цитата:
Сообщение от undefined Посмотреть сообщение
Код AS3:
Это как раз приватизация конструктора так сказать)
в чем смысл наличия флага isConstructing?
ну как...Там же все понятно вроде. Это приватная boolean переменная, которая может быть изменена только изнутри класса. По умолчанию она равна false.
Код AS3:
private static var _isConstructing:Boolean;
В конструкторе стоит её проверка, которая выдает ошибку при попытке создать экземпляр класса
Код AS3:
public function MySingleton() {
			if (!_isConstructing) throw new Error("Singleton, use MySingleton.instance");
		}
что и ограничивает создание конструктора извне класса, так как данную переменную изменить можно только изнутри. Что мы и делаем в геттере instance, единожды разрешая создание конструктора.

Код AS3:
public static function get instance():MySingleton {
			if (_instance == null)  {
				_isConstructing = true;
				_instance = new MySingleton();
				_isConstructing = false;
			}
			return _instance;
		}
причем данная операция выполняется только если переменная _instance не определена, если же экземпляр уже был создан, т1о мы просто возвращаем его, не трогая переменную _isConstructing, которая по прежнему, пребывая в false, ограничивает создание экземпляра данного класса извне.
__________________
while(live()) { hope(); }

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

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

Я просто хочу сказать, что "защита от дурака" должна быть уместна. Она должна быть только там, где действительно может быть допущена ошибка. Реальная, а не гипотетическая.
__________________
Дети не должны знать о своих родителях

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

Регистрация: Dec 2014
Адрес: Санкт-Петербург
Сообщений: 483
Цитата:
Сообщение от ZergMaster Посмотреть сообщение
у меня для этой задачи служит такой классик:

Код AS3:
 
	public function registerObject(object:Sprite, description:String):void 
		{
			_bubbleObjects[object] = {target:object, description:description};
 
			if (!_stage.hasEventListener(MouseEvent.MOUSE_OVER)) 
			{
				_stage.addEventListener(MouseEvent.MOUSE_OVER, mouseOverOutHandler, true);
				_stage.addEventListener(MouseEvent.MOUSE_OUT, mouseOverOutHandler, true);
			}
		}
ZergMaster, а в чём преимущество такого метода - вешать слушатель на весь слой, перед навешиванием слушателей непосредственно на регистрируемые объекты?

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

Регистрация: May 2008
Адрес: Питер
Сообщений: 385
Отправить сообщение для ZergMaster с помощью ICQ Отправить сообщение для ZergMaster с помощью Skype™
Цитата:
Сообщение от Appleman Посмотреть сообщение
ZergMaster, а в чём преимущество такого метода - вешать слушатель на весь слой, перед навешиванием слушателей непосредственно на регистрируемые объекты?
в данном случае реализуется "баблинг" событий. Единожды добавляем на контейнер слушатели OVER и OUT, чтобы не создавать бесчисленное множество слушателей (ведь объектов с всплывающей подсказкой может быть очень много). Всякий раз, как событие срабатывает, проверяем, не идентичен ли target одному из объектов, которые мы зарегали в бабл-коллекции. Если да, то тут уже добавляем MOVE слушатель, чтобы двигать за мышкой подсказку. Когда же происходит OUT - слушатель удаляется. Таким образом, на все про все используется два постоянных и один временный слушатель (независимо от количества зарегестрированных на подсказку объектов).

Добавлено через 2 минуты
Цитата:
Сообщение от undefined Посмотреть сообщение
так, а зачем ее сначала в true выставлять,и тут же в false?
обычно делают так:
Код AS3:
private var _instance:MySingleton;
private function MySingleton() {
...
}
public static function getInstance():MySingleton {
    if (!_instance) _instance=new MySingleton();
    return _instance;
}
и никакие флаги не нужны
все потому, что, как я уже писал, мы не можем в as3 сделать приватным конструктор. То есть
Код AS3:
private function MySingleton() {
...
}
не получится.
Соответственно, флаг обеспечивает невозможность сделать где-нибудь в коде
Код AS3:
var mySingleton = new MySingleton()
__________________
while(live()) { hope(); }

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

Регистрация: Dec 2014
Адрес: Санкт-Петербург
Сообщений: 483
Цитата:
Сообщение от ZergMaster Посмотреть сообщение
в данном случае реализуется "баблинг" событий. Единожды добавляем на контейнер слушатели OVER и OUT, чтобы не создавать бесчисленное множество слушателей (ведь объектов с всплывающей подсказкой может быть очень много). Всякий раз, как событие срабатывает, проверяем, не идентичен ли target одному из объектов, которые мы зарегали в бабл-коллекции. Если да, то тут уже добавляем MOVE слушатель, чтобы двигать за мышкой подсказку. Когда же происходит OUT - слушатель удаляется. Таким образом, на все про все используется два постоянных и один временный слушатель.
Ясно. А что с прекращением регистрации объектов? Насколько я понимаю, с одной стороны, при таком подходе никакие приёмники событий не "зависнут", и мы можем даже не делать "unregister" для добавленных объектов. У тебя даже такого метода в классе нет. С другой стороны, что будет происходить, если мы, например, захотим выводить численное значение какого-то параметра при наведении мышки на его шкалу? Мне кажется, твой класс не справится с такой задачей, т.к. description для графического объекта (собственно шкалы) он получил в момент её регистрации, и его уже будет не обновить.

Старый 27.11.2017, 18:20
undefined вне форума Посмотреть профиль Отправить личное сообщение для undefined Найти все сообщения от undefined
  № 7  
Ответить с цитированием
undefined

Регистрация: Oct 2006
Сообщений: 2,283
Цитата:
В конструкторе стоит её проверка, которая выдает ошибку при попытке создать экземпляр класса
так, а зачем ее сначала в true выставлять,и тут же в false?
обычно делают так:
Код AS3:
private var _instance:MySingleton;
private function MySingleton() {
...
}
public static function getInstance():MySingleton {
    if (!_instance) _instance=new MySingleton();
    return _instance;
}
и никакие флаги не нужны


Последний раз редактировалось undefined; 27.11.2017 в 18:35.
Старый 27.11.2017, 18:30
ZergMaster вне форума Посмотреть профиль Отправить личное сообщение для ZergMaster Найти все сообщения от ZergMaster
  № 8  
Ответить с цитированием
ZergMaster
 
Аватар для ZergMaster

Регистрация: May 2008
Адрес: Питер
Сообщений: 385
Отправить сообщение для ZergMaster с помощью ICQ Отправить сообщение для ZergMaster с помощью Skype™
Цитата:
Сообщение от undefined Посмотреть сообщение
так, а зачем ее сначала в true выставлять,и тут же в false?
дык я ж написал. Чтобы нельзя было создать инстанс извне
__________________
while(live()) { hope(); }

Старый 27.11.2017, 18:40
undefined вне форума Посмотреть профиль Отправить личное сообщение для undefined Найти все сообщения от undefined
  № 9  
Ответить с цитированием
undefined

Регистрация: Oct 2006
Сообщений: 2,283
ну так сам факт, что в _instance что-то сидит достаточно чтоб кидать ошибку.Зачем флаги еще какие-то?

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

Регистрация: Oct 2006
Сообщений: 2,283
а блин, это я с жавой попутал)
но все равно наличие флага избыточно.

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

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

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


 


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


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