【问题标题】:Is there any way to check if a class is abstract?有没有办法检查一个类是否是抽象的?
【发布时间】:2013-02-12 17:29:26
【问题描述】:

我需要一种方法来检查一个类是否是抽象的。谁能帮帮我?

【问题讨论】:

  • Mirrors 可能应该提供此信息,但似乎没有。我能想到的只是尝试实例化类并捕获异常,但这意味着您必须静态地知道构造函数签名。你想做什么?
  • 我试图移植一个Java代码sn-p,其中检查一个类是否是抽象的,并在此基础上使用反射创建了一个实例。现在查看代码,我认为没有必要进行此检查。我可以简单地实例化并检查是否发生任何错误。谢谢。

标签: dart dart-mirrors


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    你可以这样做

    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 最近有 a discussion 如果它应该被允许实例化一个抽象类(与依赖注入有关),如果上述方法的更改可能不再起作用,但我无法在问题跟踪器中找到有关它的信息。

    对此功能请求也加注星标:Add a method to check if a class is abstract

    【讨论】:

      【解决方案3】:

      可以通过reflection.

      为了进一步讨论此处缺少的功能,所需的“isAbstract”功能在大约一年后于 2014 年 1 月 9 日提交(从 history at 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

      【讨论】:

        猜你喜欢
        • 2013-07-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多