Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Делегирование методов (http://www.flasher.ru/forum/showthread.php?t=205611)

strangedk 11.12.2013 19:50

Делегирование методов
 
Добрый день. Возник интересный вопрос о настройке делегирования выполнения методов
Например, есть метод:

Код AS3:

public function test(a:int, b:int, c:int):void {
  // bla bla
}

Задача - вызвать точно такой же метод, с теми же параметрами, но у другого объекта:
Код AS3:

public function test(a:int, b:int, c:int):void {
    _anotherObject.test(a,b,c);
}

Эта реализация примитивная, и она разумеется работает.
Но у меня возник вопрос - можно ли сделать так, чтобы в объекте _anotherObject автоматически находился метод с тем же именем, что и у вызывающего метода, туда передавались аргументы, и соответственно он бы вызывался.

Чувствую, что есть лаконичное решение. Но пока не могу его себе правильно нарисовать.

alexandrratush 11.12.2013 20:12

Можно сделать так:

Код AS3:

package 
{
 
        import flash.display.MovieClip;
 
 
        public class Main extends MovieClip
        {
 
                public function Main()
                {
                        testFunc1();
                        testFunc2();
                }
 
                private function testFunc1():void
                {
                        trace(Main.functionName())//Main/testFunc1
                }
 
                private function testFunc2():void
                {
                        trace(Main.functionName())//Main/testFunc2
                }
 
                public static function functionName():String
                {
                        var s:String = new Error().getStackTrace();
                                s = s.substring(s.indexOf('at') + 2);
                        var i:int = s.indexOf('at') + 3;
                        var j:int = s.indexOf('()', i);
                        return s.substring(i, j);
                }
 
        }
}


И по имени возвращенной функции вызвать нужную как тут http://snipplr.com/view/21702/

Добавлено через 20 минут
Или так:
Код AS3:

var func:Function = _anotherObject["test"] as Function;
    func.call();


strangedk 11.12.2013 20:41

По первому методу - идея неплохая но я вот не знаю как будет вести себя стектрейс в релиз версии.
Второй метод крут, я понимаю что вот так он будет работать:

Код AS3:

function test(a,b,c):void {
    _anotherObject["test"](arguments);
}

Но как же достать ту самую строку, имя метода :)

Вот что-то есть:
http://stackoverflow.com/questions/4...rrent-function

alexandrratush 11.12.2013 20:53

Код AS3:

public static function functionName():String
{
        var s:String = new Error().getStackTrace();
                s = s.substring(s.indexOf('at') + 2);
        var i:int = s.indexOf('at') + 3;
        var j:int = s.indexOf('()', i);
 
        s = s.substring(i, j);
 
        return s.split('/')[1];
}

Вот так возвращает только имя функции.

alatar 11.12.2013 21:05

Знатный изврат, но в релизной версии будет работать только в FP 11.5 и выше.
Если наплевать на типизацию, то можно еще и с Proxy поиграться.
Но возникает вопрос: зачем все это? Если лень писать "лишние" символы, то в большинстве IDE можно настроить сниппеты и плодить такие методы в полпинка.

silin 11.12.2013 21:16

Код AS3:

package
{
        import flash.display.Sprite;
        import flash.sampler.getSavedThis;
        import flash.utils.describeType;
 
        public class Main extends Sprite
        {
                private var test:Test;
 
                public function Main():void
                {
                        test = new Test();
                        testMethod("a", "b");
                }
 
                public function testMethod(par:String, par1:String):void
                {
                        trace(this, arguments); //[object Main] a,b
 
                        var fn:Function = arguments.callee;
                        var methods:XMLList = describeType(this)..method.@name;
 
                        for each (var fName:String in methods)
                        {
                                if (this.hasOwnProperty(fName) && this[fName] != null && this[fName] === fn)
                                {
                                        break;
                                }
 
                        }
 
                        test[fName].apply(null, arguments); //[object Test] a,b
 
                }
 
        }
 
}
 
////////////////////
class Test
{
 
        public function testMethod(par:String, par1:String):void
        {
                trace(this, arguments);
 
        }
}

Добавлено через 5 минут
да, но зачем оно - непонятно, согласен с alatar

strangedk 11.12.2013 22:01

Цитата:

Сообщение от alatar (Сообщение 1154876)
Но возникает вопрос: зачем все это? Если лень писать "лишние" символы, то в большинстве IDE можно настроить сниппеты и плодить такие методы в полпинка.

Конкретно в данном случае было интересно узнать, как это вообще возможно сделать.
Ну, и задача схожая была. Правда нагляднее конечно выйдет без этих извращений, согласен.

Я понял, что без рефлексии (ну или без стектрейса) - не обойтись. Но задачка занятная. Спасибо всем!


Часовой пояс GMT +4, время: 19:33.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.