5

我需要一种方法来检查一个类是否是抽象的。有人可以帮我吗?

4

3 回答 3

2

不幸的是,现在的答案是:你不能。

正如 Justin 所提到的,有一个用于反射功能的Mirrors API 。但是,似乎没有“抽象”的标志。

如果这是您希望看到的功能,您可以在此处提交功能请求:http: //dartbug.com/new

于 2013-02-14T05:25:00.410 回答
1

你可以做类似的事情

library x;

import 'dart:mirrors';

abstract class MyAbstract {
  void doSomething();
}

class MyConcrete{
}

void main(List<String> args) {
  print('MyAbstract: ${isAbstract(MyAbstract)}');
  print('MyConcrete: ${isAbstract(MyConcrete)}');
}

bool isAbstract(Type t) {
  ClassMirror cm = reflectClass(t);
  if(cm.declarations.values.firstWhere(
      (MethodMirror mm) => mm.isAbstract == true, orElse: () => null) != null) {
    return true;
  }
  try {
    InstanceMirror i = cm.newInstance(new Symbol(''), []);
  } catch(e) {
    return (e is AbstractClassInstantiationError);
  }
  return false;
}

newInstance应该扩展该部分以检查是否没有默认构造函数并尝试命名构造函数。

AFAIR 最近有一个讨论是否应该允许实例化一个抽象类(与依赖注入有关),如果上述方法的更改可能不再起作用,但我无法在问题跟踪器中找到有关它的内容。

还要为这个功能请求加注星标:添加一个方法来检查一个类是否是抽象的

于 2014-01-10T08:13:03.313 回答
0

通过反射是可能的。

为了促进此处发生的关于缺失功能的讨论,所需的“isAbstract”功能在大约一年后于 2014 年 1 月 9 日提交(从GitHub 的历史记录中可见)。

dart:mirrors库使其很容易实现:

飞镖 SDK

  • dart:mirrors
    • ClassMirror
      • isAbstract

演示

import 'dart:mirrors';

class ConcreteClass {}

abstract class AbstractClass {}

void main() {
  ClassMirror mirroredClass;

  mirroredClass = reflectClass(ConcreteClass);
  print(mirroredClass.isAbstract); // false

  mirroredClass = reflectClass(AbstractClass);
  print(mirroredClass.isAbstract); // true
}

文档: https ://api.dart.dev/dev/2.0.0-dev.40.0/dart-mirrors/ClassMirror/isAbstract.html

于 2021-08-28T03:14:15.253 回答