PDA

Просмотр полной версии : Компилятор не видит объект.


this.create
08.07.2007, 15:57
Первый пример.
Класс:
class Test {
public function onPres():Void {
trace(this);
}
} Код в swf:
var test:Test = new Test();
mc.onPress = test.onPres; Нажимаем и получаем в трэйсе _level0.mc

Далее.
Класс:
class Test {
public function onPres():Void {
trace(this._x);
}
} Компилируем и получаем сообщение об ошибке следующего содержания:
There is no property with the name '_x'. trace(this._x); Т.е мувиклип в метод передается, но попытка получить доступ к его свойствам вызывает ошибку компиляции. У меня такое подозрение, что компилятору нужно явно указать что в метод передается именно объект типа MovieClip, чтобы он мог спокойно работать с его свойствами. А если явно не указывать, то фактически неизвестно с каким объектом будет идти работа( это определится только при вызове метода). Можно ли как-то обойти это ограничение?

iNils
08.07.2007, 16:21
Способ 1:
class Test {
private var _x:Number;
function Test () {

}
public function onPres():Void {
trace (this._x)
}
}
Способ 2:
class Test {
function Test () {

}

public function onPres():Void {
trace (this["_x"])
}
}

Способ 3 (самый правильный):
class Test {
private var __mc:MovieClip;
function Test (mc:MovieClip) {
__mc = mc;
}

public function onPres():Void {
trace(__mc._x);
}
}

import mx.utils.Delegate;
var test:Test = new Test(mc);
mc.onPress = Delegate.create (test, test.onPres);

etc
08.07.2007, 16:26
А что помешало метод так и назвать onPress, не убирая последнюю букву?
Никаких объектов в метод не передается, просто у метода изменяется область видимости на область видимости клипа mc, поэтому this ссылается уже не на экземпляр класса, а на клип. Но компилятор об этом ничего не знает, более того, в целом такой подход в принципе неверный.

this.create
08.07.2007, 17:09
iNils
Спасибо. Целых три способа.

__etc
Изменил название чтобы методы не повторялись, но если и так работает не буду менять.