2009-10-29 5 views
3

Si j'utilise des balises de métadonnées devant une interface, est-ce la même chose que devant une classe? I. e., Puis-je faireLes balises de métadonnées Flex/AS3 sont-elles gérées différemment aux définitions d'interface que dans les définitions de classe?

[Event(name="fooUpdate", type="com.acme.events.FooEvent") 
public interface IFoozer extends IEventDispatcher 
{ 
} 

// ... now omit that metadata in the implementations ... 

public class Foozer extends EventDispatcher implements IFoozer 
{ 
    public function set bar(b:Bar):void 
    { 
     this.dispatchEvent(new FooEvent(FooEvent.FOO_UPDATE)); 
    } 
} 

// ... and expect it to be known in MXML ... 

<acme:Foozer fooUpdate="myUpdateHandler"> 
    <!-- ... --> 
</acme:Foozer> 

Ou, même, avec [Bindable]?

Répondre

1

Vous pouvez définir [Event] métadonnées dans les interfaces pour À des fins d'information, mais contrairement aux fonctions, vous ne pouvez pas imposer que les implémentations utilisent ces événements. Dans mon expérience, vous devez redéfinir les événements dans les classes d'implémentation.

5

oui et non ... pour [Event] oui ... mais [Bindable] est pas seulement une balise de métadonnées ... [Bindable] (sans arguments !!) indique au compilateur de générer du code AS3, qui fera en sorte un PropertyChangeEvent est distribué si vous définissez la propriété (vous pouvez voir que si vous laissez le mxmlc garder le code AS3 généré) ...

aussi, pour [Embed] ce n'est pas le cas ([Embed] doit être suivi d'une variable.) les interfaces ne peuvent pas avoir de variables) ... vous serez toujours en mesure de récupérer les métadonnées à travers flash.utils::describeType ... ceci est assez incohérent, car certaines balises de métadonnées ne fournissent vraiment que des métadonnées compilées dans la sortie, et certaines métadonnées incite le compilateur à vraiment agir ... encore une fois, les métadonnées fournies par certaines balises sont si fortement utilisées par le framework flexible, elles deviennent une fonctionnalité de langage en MXML (comme [Event]) ... mais elles ne sont pas en AS3 ... mais AS3 est une représentation assez proche de ce qui se passe sur la VM, alors que MXML et Flex Framework ne sont que vaguement liés ... c'est aussi pourquoi les classes ActionScript et les composants MXML interopèrent très horriblement (vous avez peut-être remarqué que MXML ne avoir le concept d'interfaces, flux d'exécution (et donc le temps), alors que AS3 n'a pas les concepts d'événements ou de liaisons (qui sont "natifs" en MXML, mais sont construits sur AS3, en utilisant des métadonnées, et le flash.events paquet, en regardant très bien dans MXML, mais étant un nombre impressionnant d'appels et d'instanciations dans AS3)) ...

ce que vous voulez, sans doute pas Je pense personnellement, c'est plutôt une faille que les interfaces puissent avoir des métadonnées ... presque toutes les métadonnées sont utilisées à l'exécution ... à l'exécution, chaque objet a sa propre classe et ses interfaces sont secondaires pour l'introspection/réflexion ...

donc revenir à l'ancienne phrase de l'école: une interface exige un comportement, une classe fournit la mise en œuvre ... [Event(name="fooUpdate", type="com.acme.events.FooEvent")] est métadonnées pur ... et les métadonnées est mise en œuvre dans le monde de AS3, car cela ne nécessite pas de faire quoi que ce soit (vous pouvez aussi écrire [Bar(foo="123")]) ... c'est une balise à mettre en haut d'une classe, si et seulement si la classe a cette ligne quelque part dans son implémentation: this.dispatchEvent(new FooEvent(FooEvent.FOO_UPDATE));. .. ce que vous essayez de dire est, toute implémentation IFoozer transmettra les FooEvent.FOO_UPDATE ... c'est une garantie que le compilateur ne peut pas fournir, car il ne vérifie pas les métadonnées par rapport à la mise en œuvre ...

espoir qui a aidé ...

Questions connexes