2013-04-22 43 views
5

所有子類我在鏢三類:查找鏢

class A {} 

class B extends A{} 

class C extends A{} 

有一種方式來獲得從A所有的子類?

編輯:

感謝亞歷山大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

我很好奇你究竟在努力完成什麼。這是你的問題的答案只是一個簡單的「不」的情況之一,如果不知道實際的目標是什麼,我們不能真正提供幫助。 – 2013-04-22 20:34:56

+0

我會推薦使用可反射的lib,因爲它更適合與dart2js一起使用,它也是由dart團隊提供的 – Jonathan 2016-11-14 09:47:47

回答

6

Mirror library可以提供一些相關信息:

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

我認爲您應該能夠避免通過名稱,並將超類與一個類鏡像進行比較你要。爲了適當的通用性,您還需要遍歷所有庫。 – 2013-04-23 14:31:30

+0

假設'E類擴展C {}' - E具有A作爲超類,但是這不會包含在輸出中。也許一些遞歸解決方案? – MarioP 2013-04-24 12:19:03

+0

當然,你必須做一些遞歸來獲得所有的子類。這裏的代碼片段只是顯示一個基本的例子來找到直接的孩子。必須細化才能獲得所有的子類......我的目的是展示如何開始。 – 2013-04-24 12:32:30

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