![]() |
|
||||||||||
|
|||||
|
Привет! Старожилы, объясните пожалуйста, почему не работает вот это:
import mx.utils.Delegate;
class Test {
private static var mov:MovieClip;
function Test (){
super ();
}
public static function check ():Void{
mov = _root.attachMovie ("mc", "mc", 1, {_x: 100, _y: 200});
mov.onPress = Delegate.create (mov, pressing);
}
private static function pressing ():Void{
trace (this);
}
}
|
|
|||||
|
"this" это указание на экземпляр этого класса. а метод объявлен статическим, т.е. это метод класса, а не объекта.. такой метод не знает что такое this. кстати, зачем он приватный и статический? где можно его такой можно использовать?
|
|
|||||
|
Modus ponens
|
приватный и статический - ну, например есть класс-фабрика, и мы хотим создавать объекты статическим методом типа MyFactory.createObject("objectType") - и, например, нам нужно сделать счетчик / уникальный идентификатор для каждого нового объекта доступный только из самого объекта (потому что если мы сможем его модифицировать у класса-фабрики он может перестать быть уникальным =)
еще пример - синглтон с ленивой инициализацией - нужно создать только 1 экземплар класса, но мы не хотим явно его создавать, а чтобы он был создан / проверен на существование внутри какого-то из его методов - таким образом, например, можно добиться чего-то похожего на множественные конструкторы одного класса (типичное использование - флешка может быть скомпилирована как модуль/как самостоятельное приложение, а нам нужна утилита кторая будит выводить какую-нибудь информацию о том, что в ней происходит, но в разных ситуациях вывод будет разным) class Debugger {
private static var d:Debugger;
private function Debugger(){}
private static function createStandaloneDebugger():Debugger
{
return Debugger(new StandaloneDebugger()); // StandaloneDebugger extends Debugger
}
private static function createNetDebugger():Debugger
{
return Debugger(new NetDebugger()); // NetDebugger extends Debugger
}
public static function tracer(s:String):Void {
if (isStandalone){
if (!d) d = createStandaloneDebugger();
} else {
if (!d) d = createNetDebugger();
}
}
}
__________________
Hell is the possibility of sanity |
|
|||||
|
Статический - для того, чтобы этот метод можно было вызвать из другого статического метода.
Понятно, что this ссылается на экземпляр класса, но я ведь использую Delegate, поэтому this в данном случае ссылаться должен на клип mov. например отсюда видно: import mx.utils.Delegate;
class Test {
private static var mov:MovieClip;
function Test (){
super ();
}
public function check (mc:MovieClip):Void{
mov = mc.attachMovie ("mc", "mc", 1, {_x: 100, _y: 200});
mov.onRollOver = Delegate.create (mov, over);
trace (this)//[Object object]
}
private function over ():Void{
trace (this);//_level0.mc
}
}
Последний раз редактировалось Волгоградец; 29.06.2008 в 13:24. |
|
|||||
|
Регистрация: May 2008
Сообщений: 476
|
Привет Волгоградец!
Как только Вы уберет аттрибут static все сразу заработает! Почему?! Потому, что в статическом методе класса запрещены ссылки на его экземпляры - компиллятор бастует сразу!
__________________
Случайность, господа, это знаете ли непознанная необходимость. Последний раз редактировалось Alex_beginner; 28.06.2008 в 18:21. |
|
|||||
|
Modus ponens
|
Для этого иногда бывает нужен синглтон - т.е. объект, который можно создать только 1 раз - и его методы будут по факту работать как статические.
import mx.utils.Delegate;
class StaticTest {
private static var __i:StaticTest;
private function StaticTest(){}
public function testFunc0():Void
{
trace(this+' static');
MovieClip(this).onRelease = Delegate.create(this, __i.testFunc1);
}
public function testFunc1():Void
{
trace(this+' instance');
MovieClip(this).onRelease = Delegate.create(this, __i.testFunc0);
}
public static function testStaticDelegate(mc:MovieClip):Void
{
mc.onRelease = Delegate.create(mc, __i.testFunc0);
}
public function testInstanceDelegate(mc:MovieClip):Void
{
mc.onRelease = Delegate.create(mc, __i.testFunc1);
}
public static function getInstance():StaticTest
{
if (!__i) __i = new StaticTest();
return __i;
}
}
__________________
Hell is the possibility of sanity |
![]() |
![]() |
Часовой пояс GMT +4, время: 20:29. |
|
|
« Предыдущая тема | Следующая тема » |
|
|