2011-01-26 3 views
0

Cela n'a aucun sens pour mon cerveau faible, et j'ai atteint ma limite de googlefu.Les méthodes de prototypage ne fonctionnent pas sur textField

J'ai un tas de méthodes prototypes que j'utilise pour accélérer le développement, et la plupart d'entre eux sont attachés à DisplayObject ou InterActiveObject. Voici un exemple d'un tel prototype:

DisplayObject.prototype.$click = function(clicked:Function, released:Function = null):void{ 
    this.addEventListener(MouseEvent.MOUSE_DOWN, function():void { 
      clicked(); 
     }); 

    if(released != null){ 
     this.addEventListener(MouseEvent.MOUSE_UP, function():void { 
      released(); 
     }); 
    } 
} 

Si j'appelle une movieClipInstance.$click(someFunction), il se fixe correctement. Toutefois, si j'essaie de faire cela sur une instance TextField, cela me donne l'erreur de compilation suivante. Call to a possibly undefined method $click through a reference with static type flash.text:TextField.

Selon la référence, TextField hérite DisplayObject, mais juste pour être sûr que je redéfini explicitement mon prototype pour TextField s. Toujours la même erreur. :(

+0

Je suis allé et appris sur les méthodes de prototype dans AS3 et j'ai trouvé une réponse décevante. Je vais le mettre ci-dessous :( – MrLeap

Répondre

1

Vous pouvez toujours étendre TextField et ajoutez les méthodes là. Dans fait, vous devriez envisager de le faire pour tous les autres objec ts aussi: étendre MovieClip, Sprite, ou tout autre DisplayObject auquel vous voulez ajouter la méthode $ click. Ensuite, laissez tous vos autres objets hériter ClickMovie, ClickSprite etc. au lieu des classes génériques. Il ne devrait pas y avoir beaucoup plus de code à écrire, mais votre application sera considérablement plus rapide et sécurisée.

Vous ne devez utiliser un prototype que dans les cas où vous devez ajouter ou remplacer dynamiquement des méthodes ou des propriétés lors de l'exécution.

Une explication détaillée sur le fonctionnement de l'héritage dans AS3 peut être trouvée here.

+0

Malheureusement, vous ne pouvez pas déclarer un TextField dans le concepteur comme une sous-classe de TextField Si vous voulez des méthodes personnalisées sur vos champs de texte, vous ne pouvez pas utiliser le concepteur pour tracer votre Si vous souhaitez utiliser le concepteur pour mettre en forme vos champs de texte, vous ne pouvez pas avoir de méthodes personnalisées dans vos champs de texte.Adobe a réussi à rendre les deux fonctions mutuellement exclusives en n'autorisant pas les méthodes de prototype sur les classes non dynamiques. – Triynko

+0

De plus, manipuler des classes qui ne sont pas les vôtres via un prototype n'est pas une bonne idée, de toute façon - vous perdrez le support de l'IDE, vous aurez du mal à déboguer les choses, et qui sait ce qui pourrait casser après la prochaine mise à jour SDK ... – weltraumpirat

+0

Remplacer toutes les instances avec un crochet est Ce n'est pas une solution viable, car vous ne remplacez qu'une seule des nombreuses références au champ de texte d'origine. Par exemple, un symbole de bibliothèque de classe nommé "Form" qui contient des variables membres pointant vers son objet TextFields contient des références aux objets TextField d'origine. Ainsi, alors que vous pouvez remplacer automatiquement les instances de scène par de nouvelles occurrences de votre sous-classe TextField avec un hook, tout le reste contiendra toujours des références au TextField original et il n'y a pas de moyen facile de les mettre à jour automatiquement. – Triynko

0

Apparemment, les méthodes de prototypes ne peuvent être affectés à des classes déclarées avec le mot-clé dynamic. Je suis allé à la référence pour voir si mes expériences correspondent cette affirmation et assez sûr TextField est défini comme public class TextField. MoveClip sur le otherhand est défini comme public dynamic class MovieClip

semble un peu bancal pour moi qu'une classe non dynamique ne peut toujours pas accéder aux méthodes prototypes de ses ancêtres dynamiques bien. grèves de succession à nouveau!

Questions connexes