![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
Регистрация: 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,787
|
Для начала неплохо было бы все-таки написать 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,787
|
Да-да-да. Заплатка:
Что и как расскажу потом, ибо домой надо бежать. Последний раз редактировалось 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,787
|
Вообще говоря, лучше применять паттерн синглтон и не работать со статической ссылкой напрямую.
А заплатка… да, заплатка, потому что компилятор инициализирует все, кроме тел методов, в итоге он просто не догадывается, что 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, время: 01:23. |
|
|
« Предыдущая тема | Следующая тема » |
|
|