2010-10-29 5 views
1

Dans AS3, j'essaie de vérifier si un objet est une instance de, ou étend une classe particulière. En utilisant quelque chose comme if (object is ClassName) fonctionne très bien si l'objet est une instance de ClassName mais pas si c'est une instance d'une classe que s'étendClassName.AS3 vérifier si la classe étend une autre classe

exemple pseudo-code:

class Foo {} 
class Bar extends Foo {} 

var object = new Bar(); 

if (object is Foo){ /* not executed */ } 
if (object is Foo){ /* is executed */ } 

Je veux quelque chose comme:

class Foo {} 
class Bar extends Foo {} 

var object = new Bar(); 

if (object is Foo){ /* is executed */ } 

Toute personne idées?

+1

bien, ça marche pour moi. .. c'est ce qui devrait arriver avec le patrimoine ... Bar IS A Foo ...? non ? – OXMO456

+0

Dans ce cas, existe-t-il un moyen de lister toutes les classes que la classe actuelle étend? Exemple: en PHP, vous pouvez appeler 'class_parents ($ object)' pour récupérer un tableau de parents de classe. – Rowan

+0

Oui/Non, utilisez describeType, vous obtiendrez un XML décrivant l'Objet, j'ai mis à jour ma réponse ... – OXMO456

Répondre

5
package { 
import flash.display.Sprite; 



public class Main extends Sprite { 
    public function Main() { 
    var bar:Bar=new Bar(); 
    trace("bar is Bar",bar is Bar);//true 
    trace("bar is Foo:",bar is Foo);//true 
    trace("bar is IKingKong:",bar is IKingKong);//true 
    trace(describeType(bar)); 
    //<type name="Main.as$0::Bar" base="Main.as$0::Foo" isDynamic="false" isFinal="false" isStatic="false"> 
    //<extendsClass type="Main.as$0::Foo"/> 
    //<extendsClass type="Object"/> 
    //<implementsInterface type="Main.as$0::IKingKong"/> 
    //</type> 
    } 
} 
} 
interface IKingKong{} 
class Foo implements IKingKong{} 
class Bar extends Foo{} 
+0

Merci, je pourrais écrire une fonction d'utilité basée sur ceci. Il semble que ce soit aussi proche que je vais l'obtenir! – Rowan

0

L'utilisation d'une interface ou une classe abtract, vous devriez être en mesure de le faire

var object:Foo = new Bar(); 
if (object is Foo){ /* is executed */ } 

//or 
var object:IFoo = new Bar(); 
if (object is IFoo){ /* is executed */ } 
0
package 
{ 
import flash.display.Sprite; 
import flash.utils.getQualifiedSuperclassName; 

public class Test extends Sprite 
    { 
    public function Test() 
     { 
     trace(getQualifiedSuperclassName(this)); //returns "flash.display::Sprite" 
     } 
    } 
} 
1

Vous pouvez le faire:

class Foo {} 
class Bar extends Foo {} 

var object = new Bar(); 

if (object as Foo != null) { /* is executed */ } 
Questions connexes