2013-04-22 22 views
5

内のすべてのサブクラスを探しますか?私は3つのダーツのクラスを持っているダーツ

編集:アレクサンドル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

反射式のlibを使うことをお勧めします。なぜなら、dart2jsで使用する方が良いし、ダートチームによっても提供されるからです。 – Jonathan

答えて

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

名前を調べるのを避け、スーパークラスをクラスミラーあなたは欲しい。適切な一般性のために、すべてのライブラリを繰り返し処理する必要もあります。 –

+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 
関連する問題