2013-04-22 17 views
5

Mam trzech klas w dart:Znajdź wszystkie podklasy w dart

class A {} 

class B extends A{} 

class C extends A{} 

istnieje sposób, aby uzyskać wszystkie podklasy od A?

Edit:

Dzięki Alexandre Ardhuin rozwiązanie działało idealnie!

uczę dart edytowany swój kod i umieścić rekurencyjną rozwiązanie, spójrz:

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

Jestem ciekawa, co właściwie próbujesz osiągnąć. Jest to jeden z tych przypadków, w których odpowiedź na twoje pytanie jest prosta "Nie" i nie możemy naprawdę pomóc, nie wiedząc, jaki jest faktyczny cel. –

+0

Polecam używanie lib z możliwością odczytywania, ponieważ lepiej jest używać go z dart2js i jest on również dostarczany przez zespół dart – Jonathan

Odpowiedz

6

Mirror library może dostarczyć pewnych infos:

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'); 
    } 
    }); 
} 

wyjście będzie:

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

Myślę, że powinieneś być w stanie uniknąć przechodzenia przez nazwy i po prostu porównać nadklasę do lustra klasy na jednej chcesz. Aby uzyskać odpowiednią ogólność, należy również wykonać iterację we wszystkich bibliotekach. –

+0

załóżmy, że 'klasa E rozszerza C {}' - E ma A jako nadklasę, ale nie będzie to zawarte w danych wyjściowych. Może jakieś rozwiązanie rekursywne? – MarioP

+0

Oczywiście, musisz wykonać kilka rekursji, aby uzyskać wszystkie podklasy. Fragment kodu służy tylko do pokazania podstawowego przykładu znalezienia bezpośrednich dzieci. Musi być udoskonalony, aby uzyskać wszystkie podklasy ... Moim zamiarem było pokazanie, jak zacząć. –

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 
Powiązane problemy