Comment puis-je remplacer une fonction de définition au moment de l'exécution dans ActionScript?
-
03-07-2019 - |
Question
J'ai une classe AS avec des fonctions setter et getter. Je dois modifier l’une des instances de cette classe pour que sa fonction setter traite l’entrée avant de l’assigner à la variable locale.
ou, de manière plus élaborée, que dois-je utiliser à la place de $$$ dans l'exemple ci-dessous?
class MyClass{
private var _legend:Array;
function set legend(legend:Array):void{
_legend= legend;
}
function get legend():Array{
return _legend;
}
function someFunction():void{
foo();
}
}
var mc:MyClass = new MyClass();
mc.someFunction = function():void{
bar();
}
mc.$$ = new function(legend:Array):void{
_legend = process(legend);
}
La solution
Normalement, vous devez sous-classer MyClass pour modifier le comportement (polymorphisme) de MyClass.
class MySubClass extends MyClass {
function set legend(legend:Array):void{
// do your checking here. Then call the
// setter in the super class.
super.legend = legend;
}
}
Autres conseils
Pourquoi ne transmettez-vous pas à l'instance une entrée traitée?
mc.legend = process(legend);
Si cela n’est pas possible, vous pouvez modifier le configurateur dans MyClass et utiliser un booléen facultatif pour effectuer le traitement.
function set legend(legend:Array, flag:bool = false):void{
_legend = flag ? process(legend) : legend;
}
Notez que l'héritage de prototype ne se limite pas à une instance particulière. De la documentation:
Héritage de prototype: il s'agit du seul mécanisme d'héritage des versions précédentes d'ActionScript. Il constitue une autre forme d'héritage dans ActionScript 3.0. Chaque classe a un objet prototype associé et ses propriétés sont partagées par toutes les instances de la classe.