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

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

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

Регистрация: Dec 2014
Адрес: Санкт-Петербург
Сообщений: 479
Цитата:
Сообщение от ZergMaster Посмотреть сообщение
Хоть, как завещал дедушка Мартин, это и не тру, конечно, пользоваться флагами, но зато тут не создать, опять же, экземпляр из вне.
Поясните для чайника, плиз, что это за ситуация создания экземпляра извне? Мне представлялось, что откуда бы не создавался экземпляр, нельзя не запустить его конструктор. Или я ошибаюсь?

И ещё вопрос по теме для всех. Какой кайф создавать синглтоны и инстансы, когда можно обращаться непосредственно к паблик методам статического класса из любого места программы? Что мешает написать 'Имя класса'.'имя публичного статического метода'() и получить всё, что нужно?

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

Регистрация: Oct 2006
Сообщений: 2,281
статичный класс будет жить все время, пока работает приложение, а синглтоны можно создавать и удалять когда угодно.
Цитата:
Поясните для чайника, плиз, что это за ситуация создания экземпляра извне? Мне представлялось, что откуда бы не создавался экземпляр, нельзя не запустить его конструктор. Или я ошибаюсь?
Имеется в виду извне класса синглтона.Каноническая реализация сама создает экземпляр себя и предоставляет его всем желающим.Повторное создание со стороны блокируется модификатором private у конструктора синглтона.

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

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Класс не может диспатчить события.
__________________
Reality.getBounds(this);

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

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Цитата:
Сообщение от ZergMaster Посмотреть сообщение
это да. Не нравится мне так, непорядок. Я не гонюсь за коротким кодом с некоторых пор... ) А вот аккуратненько все должно быть и по полочкам - это желательно по возможности.
Если уж на то пошло, тогда мне больше нравится такой вариант:

Код AS3:
package {
 
	public class MySingleton {
 
		private static var _instance:MySingleton;
                //Переменная доступа
		private static var _isConstructing:Boolean;
 
		public function MySingleton() {
			if (!_isConstructing) throw new Error("Singleton, use MySingleton.instance");
		}
 
		public static function get instance():MySingleton {
			if (_instance == null)  {
				_isConstructing = true;
				_instance = new MySingleton();
				_isConstructing = false;
			}
			return _instance;
		}
	}
}
Хоть, как завещал дедушка Мартин, это и не тру, конечно, пользоваться флагами, но зато тут не создать, опять же, экземпляр из вне.


А что такое? Детская травма?)
Ну тогда этот вариант тоже надо доделать. Потому что сейчас он позволяет сделать так:
Код AS3:
MySingleton.instance;
new MySingleton();
new MySingleton();
new MySingleton();
Если дополнить конструктор вот так:
Код AS3:
public function MySingleton() {
	if (!_isConstructing || _instance) throw new Error("Singleton, use MySingleton.instance");
	_instance = this;
}
То будет уже лучше
__________________
Ко мне можно и нужно обращаться на ты)

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

Регистрация: May 2008
Адрес: Питер
Сообщений: 385
Отправить сообщение для ZergMaster с помощью ICQ Отправить сообщение для ZergMaster с помощью Skype™
Цитата:
Сообщение от undefined Посмотреть сообщение
Это что защита для многопоточности?
Это как раз приватизация конструктора так сказать)

Цитата:
Сообщение от Appleman Посмотреть сообщение
Какой кайф создавать синглтоны
кайф, чтобы у тебя был объектик.=) Так и на сердце спокойней, и диспатчить можно из него, и интерфейсы применять к нему, и удалять. И в целом приятнее.

Добавлено через 2 минуты
caseyryan
пожалуй! Хотя кем жеж это надо быть, чтобы изнутри этого класса пытаться создавать множество инстансов)) Эдак себя бить себя по рукам постоянно надо. )
А извне то все равно больше одного не создашь.
__________________
while(live()) { hope(); }

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

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

Старый 27.11.2017, 18:04
ZergMaster вне форума Посмотреть профиль Отправить личное сообщение для ZergMaster Найти все сообщения от ZergMaster
  № 17  
Ответить с цитированием
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
  № 18  
Ответить с цитированием
Tails
 
Аватар для Tails

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

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

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

Регистрация: Dec 2014
Адрес: Санкт-Петербург
Сообщений: 479
Цитата:
Сообщение от 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:20
undefined вне форума Посмотреть профиль Отправить личное сообщение для undefined Найти все сообщения от undefined
  № 20  
Ответить с цитированием
undefined

Регистрация: Oct 2006
Сообщений: 2,281
Цитата:
В конструкторе стоит её проверка, которая выдает ошибку при попытке создать экземпляр класса
так, а зачем ее сначала в 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.
Создать новую тему Ответ Часовой пояс GMT +4, время: 01:45.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

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

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


 


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


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