Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 11.12.2013, 19:50
strangedk вне форума Посмотреть профиль Отправить личное сообщение для strangedk Найти все сообщения от strangedk
  № 1  
Ответить с цитированием
strangedk
 
Аватар для strangedk

Регистрация: Oct 2010
Адрес: Харьков
Сообщений: 616
Записей в блоге: 1
Отправить сообщение для strangedk с помощью ICQ Отправить сообщение для strangedk с помощью Skype™
По умолчанию Делегирование методов

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

Код 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 автоматически находился метод с тем же именем, что и у вызывающего метода, туда передавались аргументы, и соответственно он бы вызывался.

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

Старый 11.12.2013, 20:12
alexandrratush вне форума Посмотреть профиль Отправить личное сообщение для alexandrratush Найти все сообщения от alexandrratush
  № 2  
Ответить с цитированием
alexandrratush
 
Аватар для alexandrratush

Регистрация: Jul 2013
Адрес: Днепр
Сообщений: 529
Отправить сообщение для alexandrratush с помощью ICQ Отправить сообщение для alexandrratush с помощью Skype™
Можно сделать так:

Код 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();

Старый 11.12.2013, 20:41
strangedk вне форума Посмотреть профиль Отправить личное сообщение для strangedk Найти все сообщения от strangedk
  № 3  
Ответить с цитированием
strangedk
 
Аватар для strangedk

Регистрация: Oct 2010
Адрес: Харьков
Сообщений: 616
Записей в блоге: 1
Отправить сообщение для strangedk с помощью ICQ Отправить сообщение для strangedk с помощью Skype™
По первому методу - идея неплохая но я вот не знаю как будет вести себя стектрейс в релиз версии.
Второй метод крут, я понимаю что вот так он будет работать:

Код AS3:
function test(a,b,c):void {
    _anotherObject["test"](arguments);
}
Но как же достать ту самую строку, имя метода

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

Старый 11.12.2013, 20:53
alexandrratush вне форума Посмотреть профиль Отправить личное сообщение для alexandrratush Найти все сообщения от alexandrratush
  № 4  
Ответить с цитированием
alexandrratush
 
Аватар для alexandrratush

Регистрация: Jul 2013
Адрес: Днепр
Сообщений: 529
Отправить сообщение для alexandrratush с помощью ICQ Отправить сообщение для alexandrratush с помощью Skype™
Код 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];
}
Вот так возвращает только имя функции.

Старый 11.12.2013, 21:05
alatar вне форума Посмотреть профиль Отправить личное сообщение для alatar Найти все сообщения от alatar
  № 5  
Ответить с цитированием
alatar
 
Аватар для alatar

блогер
Регистрация: Dec 2008
Адрес: Israel, Natanya
Сообщений: 4,740
Записей в блоге: 11
Знатный изврат, но в релизной версии будет работать только в FP 11.5 и выше.
Если наплевать на типизацию, то можно еще и с Proxy поиграться.
Но возникает вопрос: зачем все это? Если лень писать "лишние" символы, то в большинстве IDE можно настроить сниппеты и плодить такие методы в полпинка.
__________________
משיח לא בא
משיח גם לא מטלפן

Старый 11.12.2013, 21:16
silin вне форума Посмотреть профиль Посетить домашнюю страницу silin Найти все сообщения от silin
  № 6  
Ответить с цитированием
silin
 
Аватар для silin

блогер
Регистрация: Mar 2003
Адрес: Моск. обл.
Сообщений: 5,269
Записей в блоге: 6
Код 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

Старый 11.12.2013, 22:01
strangedk вне форума Посмотреть профиль Отправить личное сообщение для strangedk Найти все сообщения от strangedk
  № 7  
Ответить с цитированием
strangedk
 
Аватар для strangedk

Регистрация: Oct 2010
Адрес: Харьков
Сообщений: 616
Записей в блоге: 1
Отправить сообщение для strangedk с помощью ICQ Отправить сообщение для strangedk с помощью Skype™
Цитата:
Сообщение от alatar Посмотреть сообщение
Но возникает вопрос: зачем все это? Если лень писать "лишние" символы, то в большинстве IDE можно настроить сниппеты и плодить такие методы в полпинка.
Конкретно в данном случае было интересно узнать, как это вообще возможно сделать.
Ну, и задача схожая была. Правда нагляднее конечно выйдет без этих извращений, согласен.

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

Создать новую тему Ответ Часовой пояс GMT +4, время: 23:13.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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