2013-04-22 20 views
5

Ho tre classi in dardo:Trova tutte le sottoclassi di dardo

class A {} 

class B extends A{} 

class C extends A{} 

C'è un modo per ottenere tutte le sottoclassi di A?

Edit:

Grazie Alexandre Ardhuin la soluzione ha funzionato perfettamente!

sto imparando il dardo ho modificato il codice e mettere la soluzione ricorsiva, date un'occhiata:

import 'dart:mirrors'; 

class A {} 
class B extends A{} 
class C extends A{} 
class D {} 
class E extends C {} 

bool isParent(String parent,ClassMirror clazz){ 
    var objectParentName = MirrorSystem.getName(clazz.superclass.simpleName); 
    if (objectParentName == "Object"){ 
    return parent == "Object"; 
    } 
    var result = parent == objectParentName; 
    if (!result){ 
    return isParent(parent,clazz.superclass); 
    } 
    return result; 
} 

List<String> findAllSubclasses(String clazz){ 
    var result = []; 
    final ms = currentMirrorSystem(); 
    ms.isolate.rootLibrary.classes.forEach((s,c) { 
    if (isParent(clazz,c)){ 
     result.add(MirrorSystem.getName(c.simpleName)); 
    } 
    }); 
    return result; 
} 


main(){ 
    var result = findAllSubclasses('A'); 
    print(result); 
} 
+0

Sono curioso di sapere cosa stai effettivamente cercando di realizzare. Questo è uno di quei casi in cui la risposta alla tua domanda è un semplice "No", e non possiamo davvero aiutare più di così senza sapere quale sia l'obiettivo reale. –

+0

Vorrei raccomandare l'uso di lib refletterabile dato che è meglio usarlo con dart2js ed è fornito anche dal dart team – Jonathan

risposta

6

Mirror library grado di fornire alcune informazioni:

import 'dart:mirrors'; 

class A {} 
class B extends A{} 
class C extends A{} 
class D {} 

main(){ 
    final ms = currentMirrorSystem(); 
    ms.isolate.rootLibrary.classes.forEach((s,c) { 
    final parentClassName = MirrorSystem.getName(c.superclass.simpleName); 
    if (parentClassName == 'A') { 
     final className = MirrorSystem.getName(c.simpleName); 
     print('$className has A as super class'); 
    } 
    }); 
} 

L'output sarà:

C has A as super class 
B has A as super class 
+0

Penso che dovresti essere in grado di evitare di passare attraverso i nomi, e basta confrontare la superclasse con un mirror di classe su quello tu vuoi. Per una corretta generalità devi anche eseguire un'iterazione su tutte le librerie. –

+0

supponiamo che 'la classe E si estende a C {}' - E ha A come superclasse, ma questo non sarebbe incluso nell'output. Forse qualche soluzione ricorsiva? – MarioP

+0

Certo, devi fare qualche ricorsione per ottenere tutte le sottoclassi. Lo snippet di codice qui è solo per mostrare un esempio di base per trovare i bambini diretti. Deve essere raffinato per ottenere tutte le sottoclassi ... Il mio intento era di mostrare come iniziare. –

1
import 'dart:io'; 
import 'package:reflection/reflection.dart'; 

void main() { 
    var type = FileSystemEntity; 
    var result = findAllSubclasses(typeInfo(type)); 
    var text = result.join("\r"); 
    print("=============================="); 
    print("Subclasses of '${type}'"); 
    print(text); 
} 

List<String> findAllSubclasses(TypeInfo type) { 
    var typeOrig = type.originalDeclaration; 
    var childs = MirrorSystemInfo.current.isolate.libraries.values 
    .select((library) => library.getClasses(BindingFlags.PRIVATE | BindingFlags.PUBLIC).values) 
    .selectMany((clazz) => clazz) 
    .where((clazz) => clazz.isA(type) && clazz.originalDeclaration != typeOrig); 
    return childs.toList(); 
} 
============================== 
Subclasses of FileSystemEntity 
File 
_Link 
Directory 
_File 
_Directory 
Link 
Problemi correlati