2013-04-22 1 views
5

у меня есть три класса в дротике:Найти все подклассы в дротике

class A {} 

class B extends A{} 

class C extends A{} 

Там есть способ получить все подклассы от А?

Edit:

Благодаря Alexandre Ardhuin ваше решение работал отлично!

Я учусь дротик я редактировать свой код и поместить рекурсивное решение, посмотрите:

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

Мне любопытно, что вы на самом деле пытаетесь выполнить. Это один из тех случаев, когда ответ на ваш вопрос является простым «Нет», и мы не можем реально помочь, кроме этого, не зная, какова фактическая цель. –

+0

Я бы рекомендовал использовать отражающую библиотеку, так как ее лучше использовать с dart2js, и она также предоставляется командой дротика. – Jonathan

ответ

6

Mirror library может предоставить некоторые 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'); 
    } 
    }); 
} 

Выход будет:

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

Я думаю, что вы должны быть в состоянии избежать имен и просто сравнить суперкласс с зеркалом класса на одном вы хотите. Для правильной общности вам также нужно перебирать все библиотеки. –

+0

Предположим, что 'class E extends C {}' - E имеет A как суперкласс, но это не будет включено в вывод. Может быть, какое-то рекурсивное решение? – MarioP

+0

Конечно, вам нужно сделать некоторые рекурсии, чтобы получить все подклассы. В этом фрагменте кода показан только базовый пример поиска прямых детей. Он должен быть усовершенствован, чтобы получить все подклассы ... Мое намерение состояло в том, чтобы показать, как начать работу. –

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 

 Смежные вопросы

  • Нет связанных вопросов^_^