2015-05-17 3 views
0

То, что я в основном пытаюсь создать динамически в классе после создания экземпляра класса ... Я действительно не знаю, можно ли достичь этого в as3 ... вот несколько примеров:Динамически создавать функцию в классе as3

var mc:SomeClass = new SomeClass(); 
    mc["myMethod"] = function():void {}; 

или

public function SomeClass() 
    { 
    } 

    public function addMethod(methName:String, func:Function):void 
    { 
     pushMeth(func); 
     this[methName] = getMeth(); 
    } 

обоих примерах одинаковы ...

mc["myMethod"] = function():void {}; 

или

this[methName] = getMeth(); 

бросает:
ReferenceError: Error # 1056: Не удается создать свойство MyMethod на SomeClass

так что вы можете дать свои какие-либо предложения, как я могу добиться этого или что проблема в моем коде, или может Я вообще достигаю этого эффекта?

EDIT !!!
полный рабочий код @null

public dynamic class OverloadExample 
    { 
     private var _meths:Object = {}; 
     public function OverloadExample() 
     { 
     } 

     public function addMethod(methName:String, func:Function):void 
     { 
      pushMeth(func); 
      this[methName] = getMeth; 
     } 

     private function pushMeth(func:Function):void 
     { 
      _meths[func.length] = func; 
     } 

     private function getMeth(...args):void 
     { 
      var l:int = args.length; 
      if (_meths[l]) { 
       _meths[l].apply(this,args); 
      } 
     } 
    } 


var o:OverloadExample = new OverloadExample(); 
    o.addMethod("mm", function(a:int):void { trace("one"); }); 
    o.addMethod("mm", function(a:int,b:int):void { trace("two"); }); 
    o.mm(1); 
    o.mm(2,3); 


Примечание: это просто пример того, как достичь эффекта перегрузки ...
Теперь я» m пытается использовать addMethod две или более функции с одинаковым количеством аргументов, но эти аргументы могут быть разных типов, и у меня есть некоторые улучшения ...

+0

Это в основном способ сделать вещи очень непрозрачными и сложными для отладки. Вы не создаете динамических методов, а просто добавляете ссылку на существующие. Вы также не предоставляете никаких функций перегрузки, как вы утверждаете. В конце концов, единственная функциональность, которую вы достигаете, - это свободные методы класса, которые могут избежать полной проверки времени компиляции. – BotMaster

ответ

1

SomeClass должно быть динамическим.

public dynamic class SomeClass { 

A dynamic class defines an object that can be altered at run time by adding or changing properties and methods.

0

Вы можете создать свойство, которое удерживает Function с. класс SomeClass общественного {

private var functions:Object = {}; 

public function SomeClass() 
{ 
} 

public function addFunction(name:String, function:Function):void 
{ 
    functions[name] = function; 
} 

} 

Это имеет то преимущество, что вы не должны сделать свой класс dynamic, что очень нежелательно, так как динамический класс труднее быть ошибки проверяются во время компиляции.

Вы все еще должны проверять достоверность.

Сравните это с классом EventDispatcher, что позволяет добавить к нему «методы» без dynamic.

+0

То, что я пытаюсь добиться, - это эффект перегрузки в as3, поэтому я хотел вызвать свою добавленную функцию, напрямую вызвав ее, а не с помощью другой функции, например: 'mc.myAddedMethod (someParamsHere)' в вашем коде мне понадобится дополнительная метод ex: 'public function callMethod (methName: String): void {}', который вызывает нужную функцию ...спасибо за ответ – Ratty

+0

Вы используете имена для идентификации своих методов, а это значит, что вы все равно не можете перегружать одно имя метода. То, что вы делаете, не имеет ничего общего с перегрузкой. вы в основном просто хотите добавить методы к объекту во время выполнения. Если вы хотите напрямую вызвать методы, взгляните на шаблон декоратора, он позволит вам расширить класс во время выполнения, но с безопасностью типа. – null

+0

Я не написал весь код ... Я достиг этого эффекта 'mc.addMethod (" mm ", function (a: int): void {trace (a);}); mc.addMethod ("mm", function (a: int, b: int): void {trace (a, b);}); mc.mm (1); mc.mm (2,3); 'это работает для меня – Ratty

Смежные вопросы