Как работает обратный вызов в Actionscript 3? - PullRequest
1 голос
/ 22 декабря 2010

Имея сильный C ++ фон, мне интересно, как это работает в Actionscript:

class A {

    public function callme():void {
    }

    public function foo():void {
        var a:Function = callme;
        a();
    }
}

Вопрос в том, передает ли Actionscript "тайно" указатель объекта рядом с указатель на функцию ?

Еще один вопрос: возможно ли сделать что-то подобное (псевдокод):

class A {

    public function callme():void {
    }

    public function foo():void {
        var a:Function = callme;
        var classAinstance:A = new A();
        classAinstance.a();
    }
}

т.е. иметь отдельные указатели на функцию и объект.

Ответы [ 2 ]

2 голосов
/ 22 декабря 2010

Да, Flash передает контекст объекта вместе с указателем на функцию.Это не всегда имело место, но верно для ActionScript 3.0.См. Здесь:

http://www.adobe.com/devnet/actionscript/articles/actionscript3_overview.html

Закрытия методов

Обработка событий упрощена в ActionScript 3.0 благодаря закрытиям методов, которые предоставляют встроенныеВ делегацию мероприятия.В ActionScript 2.0 закрытие не запоминает, из какого экземпляра объекта оно было извлечено, что приводит к неожиданному поведению при вызове замыкания.Класс mx.utils.Delegate был популярным решением проблемы;чтобы использовать его, вы должны написать код следующим образом:

myButton.addEventListener("click", Delegate.create(this, someMethod));

Этот класс больше не нужен, потому что в ActionScript 3.0 будет закрыто закрытие метода при ссылке на someMethod.Закрытие метода автоматически запомнит исходный экземпляр объекта.Теперь можно просто написать:

myButton.addEventListener("click", someMethod);

Что касается вашего второго вопроса, если вы хотите запустить метод в контексте другого объекта, тогда используйте .call() или .apply().

a.call(classA);

http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/Function.html?filter_coldfusion=9&filter_flex=3&filter_flashplayer=10&filter_air=1.5

1 голос
/ 22 декабря 2010

Пожалуйста, попробуйте задать один вопрос за раз.

ActionScript не использует указатели как таковые . Когда вы передаете функцию объекта, вы передаете функцию в контексте этого объекта. Функция будет по-прежнему ссылаться на объект, с которого она поступила.

Вы действительно должны спросить разработчиков ActionScript о том, что на самом деле происходит за кулисами, но я уверен, что вы получите ответ в духе "мы не раскрываем договор "

Что касается вашего псевдокода, думаю, вы хотели написать classA.a();

поскольку у класса A, который вы определили, нет ни свойства, ни функции a, которая является публично видимой, вызывая classA.a(); не будет работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...