我需要一种方法来检查一个类是否是抽象的。有人可以帮我吗?
问问题
187 次
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 回答