2010-04-08 4 views
1

Existe-t-il une méthode non-hacky pour déterminer si une classe super classe implémente une interface particulière?ActionScript: Déterminer si superclasse implémente une interface particulière?

Par exemple, supposons que j'ai:

class A extends EventDispatcher implements StuffHolder { 
    protected function get myStuff():Stuff { ... }; 

    public function getStuff():Array { 
     if (super is StuffHolder) // <<< this doesn't work 
      return super['getStuff']().concat([myStuf]); 
     return [myStuff]; 
} 

class B extends A { 
    override protected function get myStuff():Stuff { ... }; 
} 

Comment pourrais-je effectuer cette super is StuffHolder essai d'une manière qui, bien, fonctionne? Dans ce cas, il renvoie toujours true.

+0

Que faire si vous essayez de le jeter comme StuffHolder au lieu de vérifier? Quelque chose comme si (super comme StuffHolder)? – Sandro

+0

Non, aucun amour - 'super' semble avoir trop de magie pour le faire –

+0

Si EventDispatcher implémenté StuffHolder, vous ne seriez pas en mesure de compiler cela sans 'override' modificateur pour A getStuff .. Signification super l'aurait, de toute façon .. L'héritage est vérifié au moment de la compilation, n'est-ce pas? Pourquoi ne pas savoir si parent implémente une classe? – mrkishi

Répondre

1

Dans ce cas, vous devrez peut-être définir StuffHolder (et l'étendre EventDispatcher) en tant que classe et avoir getStuff en tant que fonction publique/protégée. Vous pouvez ensuite surcharger la fonction getStuff en classe A, mais pas en classe B.

package { 
public class StuffHolder extends EventDispatcher { 
    function StuffHolder() { 

    } 
    protected function getStuff():Array{ 
    return ["Default"]; 
    } 
} 
} 
package { 
public class A extends StuffHolder { 
    function A { 
    super(); 
    } 
    protected override function getStuff():Array { 
    return ["A"]; 
    } 
} 
} 
package { 
public class B extends StuffHolder { 
    function B { 
    super(); 
    } 
} 
} 
+0

Le problème ici est que vous ne pouvez pas faire de l'héritage multiple avec AS3, ce qui je pense aiderait dans votre cas. Ce post peut également vous aider. http://www.darronschall.com/weblog/2006/10/multiple-inheritance-in-actionscript-3.cfm bonne chance! – Sandro

+0

Yup, c'est le problème. Dans mon cas, la fonction 'getStuff' est en fait un mixin qui est implémenté via un' include '... "', donc je ne veux pas changer les superclasses de ce que j'étends. –

1

Je n'ai pas l'image complète pour savoir pourquoi vous auriez besoin de ce genre d'héritage (bizarre et peut-être rompu) , mais pourriez-vous le reformuler en si (ceci est en fait une instance A)?

Si oui, vous pourriez aller avec ...

import flash.utils.getQualifiedClassName; 

if (getQualifiedClassName(this) == 'A') 

La chose est, l'opérateur est doit être utilisé sur les instances d'objet. Et cela fonctionne tout le chemin jusqu'à l'objet - je veux dire, A est B est vrai pour chaque A l'implémentation de l'ancêtre ou de l'interface.

Je pense que vous pourriez trouver une meilleure structure pour vos cours, cependant. Ce n'est pas joli.

+0

Comme je l'ai mentionné sur le commentaire de Sandro, ma fonction 'getStuff' est en fait un mixin qui est' include '... "' 'd, donc il ne sait même pas de quelle classe il s'agit. La seule chose qu'il sait est que la classe à laquelle il est appliqué a implémenté l'interface 'StuffHolder'. –

+0

Omg .. Ça devient encore plus laide. Très bien. Donc .. Est-ce que "if (super.foo! = Null) super.foo()" suffit? Ou avez-vous besoin de savoir si _really_ implémente StuffHolder? Si oui ... Réflexion. "describeType (getDefinitionByName (getQualifiedSuperclassName (this)))" retournera la description XML de la superclasse (EventDispatcher, dans la classe A, par exemple). Il aura un "" tag avec une liste de ses interfaces mises en œuvre ... – mrkishi

0

que je pouvais faire quelque chose qui implique l'introspection, obtenir la classe actuelle, trouver sa classe parent, puis de vérifier pour voir si qui implémente l'interface StuffHolder ... Mais cela semble assez laid :(

Questions connexes