2017-10-03 9 views
3

Dans l'exemple, j'ai trois classes: View, FView (extends View) et MView (extends View). J'ai une variable de type MView et je veux la vérifier par rapport à la classe parente View (c'est-à-dire si cette variable provient de la classe View). Est-il possible d'obtenir la classe parent (View class)? . Voici exemple complet: https://try.haxe.org/#eA594Puis-je obtenir le nom de la classe parent (le premier) sur les classes héritées?

class Test { 
    static function main() { 
     var v = new SView(); 
     trace(Type.getClassName(Type.getSuperClass(Type.getClass(v)))); 
    } 
} 

classe Vue:

class View { 
    public function new() { 

    } 
} 

classe FVULO:

class FView extends View { 
    public function new() { 
     super(); 
    } 
} 

classe sview:

class SView extends FView { 
    public function new() { 
     super(); 
    } 
} 
+0

Vous mentionnez 'MView' mais votre exemple actuel ne l'inclut pas. Au lieu de cela, il inclut 'SView' qui hérite de' FView', donc la hiérarchie de classes listée ci-dessus est différente de ce que vous décrivez. Quelle est la bonne hiérarchie de classe? Il semble que votre exemple de code ci-dessus fonctionne correctement, actuellement. – bsinky

Répondre

5

Si vous voulez aller à la classe de base, vous pouvez simplement récursif ou itérer jusqu'à Type.getSuperClass() retours null:

// at runtime: find out what is the base class of `v` 
var base:Class<Dynamic> = Type.getClass(v); 
while (true) { 
    var s = Type.getSuperClass(base); 
    if (s == null) 
     break; 
    base = s; 
} 
trace(Type.getClassName(base)); 

, vous mentionnez cependant que vous voulez faire cela simplement pour vérifier si MView (ou SView) sont du type View.

Eh bien, pour cela, il y a quelques alternatives plus simples ...

D'abord, au type de compilation, vous pouvez simplement utiliser un type check (ou cession) pour vérifier si v:SViewunifies avec View:

// at compile time: enforce that `v` be of type `View` or compatible with it 
var v1 = (v:View); // use a type check 
var v2:View = v; // or simply pass it to something expecting `View` 

Si vous avez besoin de le faire lors de l'exécution, c'est possible aussi bien avec Std.is():

// at runtime: check if `v` is a subclass instance of `View` 
trace(Std.is(v, View)); 

Pour un exemple complet, consultez this Essayez l'instance Haxe.