|
|
|||||
Делегирование методов
Добрый день. Возник интересный вопрос о настройке делегирования выполнения методов
Например, есть метод: Задача - вызвать точно такой же метод, с теми же параметрами, но у другого объекта: Эта реализация примитивная, и она разумеется работает. Но у меня возник вопрос - можно ли сделать так, чтобы в объекте _anotherObject автоматически находился метод с тем же именем, что и у вызывающего метода, туда передавались аргументы, и соответственно он бы вызывался. Чувствую, что есть лаконичное решение. Но пока не могу его себе правильно нарисовать.
__________________
adobe AS3 manual |
|
|||||
Можно сделать так:
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 минут Или так: |
|
|||||
По первому методу - идея неплохая но я вот не знаю как будет вести себя стектрейс в релиз версии.
Второй метод крут, я понимаю что вот так он будет работать: Но как же достать ту самую строку, имя метода Вот что-то есть: http://stackoverflow.com/questions/4...rrent-function
__________________
adobe AS3 manual |
|
|||||
Вот так возвращает только имя функции.
|
|
|||||
Знатный изврат, но в релизной версии будет работать только в FP 11.5 и выше.
Если наплевать на типизацию, то можно еще и с Proxy поиграться. Но возникает вопрос: зачем все это? Если лень писать "лишние" символы, то в большинстве IDE можно настроить сниппеты и плодить такие методы в полпинка.
__________________
משיח לא בא משיח גם לא מטלפן |
|
|||||
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); } } да, но зачем оно - непонятно, согласен с alatar |
|
|||||
Цитата:
Ну, и задача схожая была. Правда нагляднее конечно выйдет без этих извращений, согласен. Я понял, что без рефлексии (ну или без стектрейса) - не обойтись. Но задачка занятная. Спасибо всем!
__________________
adobe AS3 manual |
Часовой пояс GMT +4, время: 23:13. |
|
« Предыдущая тема | Следующая тема » |
Опции темы | |
Опции просмотра | |
|
|