【问题标题】:Find all subclasses in dart查找 dart 中的所有子类
【发布时间】:2013-04-15 13:13:57
【问题描述】:

我在 dart 中有三个类:

class A {}

class B extends A{}

class C extends A{}

有没有办法从 A 获取所有子类?

编辑:

感谢 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);
}

【问题讨论】:

  • 我很好奇你实际上想要完成什么。这是您的问题的答案是简单的“不”的情况之一,如果不知道实际目标是什么,我们真的无能为力。
  • 我建议使用反射库,因为它更好地与 dart2js 一起使用,它也是由 dart 团队提供的

标签: inheritance reflection dart dart-mirrors


【解决方案1】:

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

【讨论】:

  • 我认为您应该能够避免遍历名称,只需将超类与您想要的类镜像进行比较。为了获得适当的通用性,您还需要遍历所有库。
  • 假设 class E extends C {} - E 有 A 作为超类,但这不会包含在输出中。也许一些递归解决方案?
  • 当然,您必须进行一些递归才能获得所有子类。这里的代码 sn -p 只是为了展示一个基本的例子来寻找直接的孩子。必须对其进行改进以获取所有子类......我的目的是展示如何开始。
  • dart:mirrors 已弃用并已从存储库中删除。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-26
  • 1970-01-01
  • 2014-04-28
  • 2022-01-23
相关资源
最近更新 更多