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

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

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

Регистрация: Jan 2004
Адрес: На чердаке.
Сообщений: 1,112
По умолчанию Экземпляр, созданный при объявлении статического свойства не видит других классов

Столкнулся со следующей штукой.
Код:
class MyClass {
	static var ref = new MyClass("from class MyClass: ");
	function MyClass(from) {
		var from=from? from : "from outside:"
		trace(from+"  "+mx.events.EventDispatcher);
	}
}
во fla:
Код:
myClass = new MyClass();
//from class MyClass:   undefined
//from outside:  [type Function]
При создании экземпляра класса через объявление статического свойства класса экземпляр не видит других пользовательских классов.
(С тем же успехом вместо mx.events.EventDispatcher можно написать mx.utils.Delegate)
Однако
Код:
class MyOtherClass extends MyClass {
	static var ref = new MyOtherClass("from class MyOtherClass extends MyClass: ");
	function MyOtherClass(from) {
		super(from)
	}
}
Код:
myOtherClass = new MyOtherClass();
//from class MyClass:   [type Function]
//from class MyOtherClass extends MyClass:   [type Function]
//from outside:  [type Function]
В этом случае все работает, то есть в дочернем классе при создании экземпляра через стат-свойство мы можем обращаться к методам и свойствам других классов.

Кроме того, если в MyClass заменить EventDispatcher на какой-либо из документированных классов (XML или скажем BitmapData) - тоже все нормально работает.
В чем тут дело? Особый порядок инициализации классов?
__________________
...Тебе страшно? Мне - нет.


Последний раз редактировалось Ромастый; 06.08.2007 в 19:55.
Старый 06.08.2007, 20:04
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 2  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,784
Для начала неплохо было бы все-таки написать import.

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

Регистрация: Jan 2004
Адрес: На чердаке.
Сообщений: 1,112
Цитата:
Сообщение от __etc
Для начала неплохо было бы все-таки написать import.
А без разницы. В AS2 директива import используется только для сокращения полных имен классов.
Но даже если написать import
Код:
import mx.events.EventDispatcher;
class MyClass {
	static var ref = new MyClass("from class MyClass: ");
	function MyClass(from) {
		var from=from? from : "from outside:"
		trace(from+"  "+EventDispatcher);
	}
}
флэш все равно выдаст from class MyClass: undefined
Ессно проверял, перед тем как постить.
__________________
...Тебе страшно? Мне - нет.

Старый 06.08.2007, 20:19
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 4  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,784
Да-да-да. Заплатка:

Код:
import mx.events.EventDispatcher;
class MyClass {
	private static var __dummy:EventDispatcher = EventDispatcher;
	public static var instance:Object = new MyClass("static");
	public function MyClass(str:String) {
		trace(str+':'+EventDispatcher);
	}
}
Что и как расскажу потом, ибо домой надо бежать.


Последний раз редактировалось etc; 06.08.2007 в 20:22.
Старый 06.08.2007, 20:30
Ромастый вне форума Посмотреть профиль Отправить личное сообщение для Ромастый Найти все сообщения от Ромастый
  № 5  
Ответить с цитированием
Ромастый
 
Аватар для Ромастый

Регистрация: Jan 2004
Адрес: На чердаке.
Сообщений: 1,112
Цитата:
Сообщение от __etc
Да-да-да. Заплатка
Мда, не сообразил...
Спасиб!

P.S. Раз речь идет о заплатке, как я понял - очередные грабли?
__________________
...Тебе страшно? Мне - нет.

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

Регистрация: Oct 2006
Адрес: spb.ru
Сообщений: 3,221
У меня FDT вообще не дает объявлять непростые типы вне функций.
Грабли в том, что например вы пишете
Код:
static var ref = new MyClass("from class MyClass: ");
а попробуйте написать так:
Код:
var ref = new MyClass("from class MyClass: ");
Знайте, что ref во втором случае тоже будет статичным.

Старый 06.08.2007, 21:56
Ромастый вне форума Посмотреть профиль Отправить личное сообщение для Ромастый Найти все сообщения от Ромастый
  № 7  
Ответить с цитированием
Ромастый
 
Аватар для Ромастый

Регистрация: Jan 2004
Адрес: На чердаке.
Сообщений: 1,112
Цитата:
Сообщение от Kikasso
а попробуйте написать так:
Код:
var ref = new MyClass("from class MyClass: ");
Знайте, что ref во втором случае тоже будет статичным.
Очень спорно. Поясню:
1.Если так писать при объявлении свойства - будет белиберда.
2.Если ref объявить как static, а значение присваивать в конструкторе, то оно ессно будет статическим, вот только каждый раз это будет новый объект.
3.Единственно что в таком варианте сработает - это написать отдельный метод, который создает экземпляр MyClass и делает ref ссылкой на него, после чего вызывать это метод единожды.
А вопрос был собственно о создании экземпляра в объявлении свойств.
__etc дал ответ в точку.
__________________
...Тебе страшно? Мне - нет.


Последний раз редактировалось Ромастый; 06.08.2007 в 22:00.
Старый 06.08.2007, 22:56
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 8  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,784
Вообще говоря, лучше применять паттерн синглтон и не работать со статической ссылкой напрямую.

А заплатка… да, заплатка, потому что компилятор инициализирует все, кроме тел методов, в итоге он просто не догадывается, что EventDispatcher нужно инициализировать раньше MyClass.

Старый 07.08.2007, 01:57
Ромастый вне форума Посмотреть профиль Отправить личное сообщение для Ромастый Найти все сообщения от Ромастый
  № 9  
Ответить с цитированием
Ромастый
 
Аватар для Ромастый

Регистрация: Jan 2004
Адрес: На чердаке.
Сообщений: 1,112
Вот собсно необходимость такой заплатки и интересовала - почему флэш в данном случае прекрасно видит документированные классы (вроде той же BitmadDatы), но не инициализирует пользовательские?
Напрашивается только один ответ.

Что касается синглтона... Если интересно, могу рассказать.
Есть дерево классов с бесконечным количеством дочерних классов (теоретически, практически же 5-10 уровней наследования, но сути не меняет).
Статические(!) свойства любого из классов могут меняться по событию,
И все экземпляры этого класса, а также экземпляры расширяющих этот класс, должны тут же отреагировать.
Собственно, синглтон я сразу же и использовал - подписывать все экземпляры дочернего класса на его синглтон, а синглтон дочернего в свою очередь на синглтон родительского.
Вот только одна проблема: при расширении синглтона метод getInstance в дочернем классе каждый раз надо оверрайдить. Учитывая 5-10 уровней наследования и около 200-300 классов, картинка получается жестковата, даже несмотря на то, что as-файлы будут генериться каким-нить ming'ом... В общем захотелось схалявить, и сделать это одной строчкой - через объявление статического свойства и присвоение ему экземпляра.
Если есть другие решения - буду рад узнать
__________________
...Тебе страшно? Мне - нет.


Последний раз редактировалось Ромастый; 07.08.2007 в 02:06.
Старый 07.08.2007, 02:34
Kikasso вне форума Посмотреть профиль Отправить личное сообщение для Kikasso Найти все сообщения от Kikasso
  № 10  
Ответить с цитированием
Kikasso
 
Аватар для Kikasso

Регистрация: Oct 2006
Адрес: spb.ru
Сообщений: 3,221
Я собственно другой глюк имел в виду.
as
Код:
 
class Test{
 public static var arr:Array = [];
 public var arr2:Array = [];
 public var id:String;
 public function Test( id:String ){
  arr.push( this );
  arr2.push(this);  
  this.id = id;  
  }
 public function toString():String{
 return 'Test '+ id;
 }  
}
fla
Код:
 
 
import Test;
var t1:Test = new Test('t1');
var t2:Test = new Test('t2');
trace( Test.arr );
trace('----------');
trace( t1.arr2 );
trace('----------');
trace( t2.arr2 );
trace('----------');
trace
Код:
 
Test t1,Test t2
----------
Test t1,Test t2
----------
Test t1,Test t2
----------
Попытка оттрейсить Test.arr2 вызовет ошибку - то есть свойство как бы не статичное.
А по вашему вопросу - можно так:
as
Код:
class Test{
public static var ref:Test = Test.createRef();
public var id:String;
public static function createRef():Test{
	trace('ссылка создана');
	return new Test('etalon');
}
public function Test( id:String ){
	this.id = id;
}
public function toString():String{
	return 'Test '+ id;
}		
}
fla
Код:
import Test;
var t1:Test = new Test('t1');
trace( Test.ref );
var t2:Test = new Test('t2');
trace( Test.ref );
P.S. что такое синглтон, сорри, не знаю. Гуглить лень.


Последний раз редактировалось Kikasso; 07.08.2007 в 02:49.
Создать новую тему Ответ Часовой пояс GMT +4, время: 17:20.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

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

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


 


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


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