|
|
« Предыдущая тема | Следующая тема » |
Опции темы | Опции просмотра |
|
|
|||||
Регистрация: 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); } } При создании экземпляра класса через объявление статического свойства класса экземпляр не видит других пользовательских классов. (С тем же успехом вместо 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. |
|
|||||
Et cetera
Регистрация: Sep 2002
Сообщений: 30,784
|
Для начала неплохо было бы все-таки написать import.
|
|
|||||
Регистрация: Jan 2004
Адрес: На чердаке.
Сообщений: 1,112
|
Цитата:
Но даже если написать 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); } } Ессно проверял, перед тем как постить.
__________________
...Тебе страшно? Мне - нет. |
|
|||||
Et cetera
Регистрация: Sep 2002
Сообщений: 30,784
|
Да-да-да. Заплатка:
Что и как расскажу потом, ибо домой надо бежать. Последний раз редактировалось etc; 06.08.2007 в 20:22. |
|
|||||
Регистрация: Jan 2004
Адрес: На чердаке.
Сообщений: 1,112
|
Цитата:
Спасиб! P.S. Раз речь идет о заплатке, как я понял - очередные грабли?
__________________
...Тебе страшно? Мне - нет. |
|
|||||
Регистрация: Oct 2006
Адрес: spb.ru
Сообщений: 3,221
|
У меня FDT вообще не дает объявлять непростые типы вне функций.
Грабли в том, что например вы пишете а попробуйте написать так: Знайте, что ref во втором случае тоже будет статичным. |
|
|||||
Регистрация: Jan 2004
Адрес: На чердаке.
Сообщений: 1,112
|
Цитата:
1.Если так писать при объявлении свойства - будет белиберда. 2.Если ref объявить как static, а значение присваивать в конструкторе, то оно ессно будет статическим, вот только каждый раз это будет новый объект. 3.Единственно что в таком варианте сработает - это написать отдельный метод, который создает экземпляр MyClass и делает ref ссылкой на него, после чего вызывать это метод единожды. А вопрос был собственно о создании экземпляра в объявлении свойств. __etc дал ответ в точку.
__________________
...Тебе страшно? Мне - нет. Последний раз редактировалось Ромастый; 06.08.2007 в 22:00. |
|
|||||
Et cetera
Регистрация: Sep 2002
Сообщений: 30,784
|
Вообще говоря, лучше применять паттерн синглтон и не работать со статической ссылкой напрямую.
А заплатка… да, заплатка, потому что компилятор инициализирует все, кроме тел методов, в итоге он просто не догадывается, что EventDispatcher нужно инициализировать раньше MyClass. |
|
|||||
Регистрация: Jan 2004
Адрес: На чердаке.
Сообщений: 1,112
|
Вот собсно необходимость такой заплатки и интересовала - почему флэш в данном случае прекрасно видит документированные классы (вроде той же BitmadDatы), но не инициализирует пользовательские?
Напрашивается только один ответ. Что касается синглтона... Если интересно, могу рассказать. Есть дерево классов с бесконечным количеством дочерних классов (теоретически, практически же 5-10 уровней наследования, но сути не меняет). Статические(!) свойства любого из классов могут меняться по событию, И все экземпляры этого класса, а также экземпляры расширяющих этот класс, должны тут же отреагировать. Собственно, синглтон я сразу же и использовал - подписывать все экземпляры дочернего класса на его синглтон, а синглтон дочернего в свою очередь на синглтон родительского. Вот только одна проблема: при расширении синглтона метод getInstance в дочернем классе каждый раз надо оверрайдить. Учитывая 5-10 уровней наследования и около 200-300 классов, картинка получается жестковата, даже несмотря на то, что as-файлы будут генериться каким-нить ming'ом... В общем захотелось схалявить, и сделать это одной строчкой - через объявление статического свойства и присвоение ему экземпляра. Если есть другие решения - буду рад узнать
__________________
...Тебе страшно? Мне - нет. Последний раз редактировалось Ромастый; 07.08.2007 в 02:06. |
|
|||||
Регистрация: 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; } } 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('----------'); Попытка оттрейсить 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; } } Последний раз редактировалось Kikasso; 07.08.2007 в 02:49. |
Часовой пояс GMT +4, время: 17:20. |
|
« Предыдущая тема | Следующая тема » |
|
|