Переопределение общедоступного метода в динамически загружаемом классе с помощью AS3 и getDefinitionByName()

У меня есть два SWF: main.swf и external.swf. main.swf требуется доступ к некоторым методам в external.swf, поэтому он загружает external.swf в себя и использует getDefinitionByName("package.Class") для доступа к классу и одному из его методов:

var ExternalClass = getDefinitionByName("package.Class") as Class;
var ClassInstance = new ExternalClass();
var NeededFunction:Function = ClassInstance["NeededFunction"] as Function;
var response:String = NeededFunction(param);

Теперь мне нужно расширить функциональность NeededFunction (который является общедоступным методом)... Я знаю, что можно переопределить общедоступные методы, но как мне это сделать с динамически загружаемым классом?

Я думал, что могу сделать что-то вроде этого, но это не работает:

var ClassInstance["NeededFunction"] = function(param1:uint):String { 
    var newString = "Your number is: "+param1.toString();  //New functionality
    return newString;
}

person lefthandpath    schedule 22.08.2010    source источник


Ответы (2)


Еще один способ решить эту проблему — включить классы в пакет, доступный обоим SWF-файлам. Просто добавьте корневую папку классов в путь ActionScript.

Вместо получения класса с помощью getDefinitionByName вы просто импортируете его. Что касается переопределения, вы можете создать класс, который переопределяет один из классов, или вы можете создать интерфейс.


import com.yourlocation.ExternalClass;

var external:ExternalClass = new ExternalClass();

person PatrickS    schedule 22.08.2010
comment
К сожалению, у меня нет доступа к классам SWF, иначе я бы давно сделал то, что вы предложили. Метод, который мне нужно расширить, взят из проприетарной библиотеки SWC, поэтому я не могу модифицировать SWC, пока не попытаюсь разобрать его, чего я делать не собираюсь. - person lefthandpath; 22.08.2010
comment
Эта статья может помочь: airtightinteractive.com/2009/ 06/ - person PatrickS; 22.08.2010

С помощью FlashDevelop это довольно просто исправить.

Щелкните правой кнопкой мыши включенный swc в списке проектов. Выберите параметры, затем «включить библиотеку (полная библиотека)».

..теперь вы можете использовать getDefinitionByName для получения класса без ссылки из вашего файла swc.

person Daniel    schedule 21.02.2012