【问题标题】:Dart/Flutter - Call constructor of unknown concrete class (get class from Type)Dart/Flutter - 调用未知具体类的构造函数(从 Type 获取类)
【发布时间】:2023-04-03 06:29:01
【问题描述】:

我想调用一个具体类的构造函数,但我只有一个实现接口的Type。是否可以从 Type 获取具体类并调用其构造函数而无需实际知道它?

我当前的解决方法是使用强制转换的开关,但这似乎不合理,因为每当另一个类实现该接口时,我都必须维护该开关。

abstract class IFace {
  String foo();
}

class Bar implements IFace {
  String foo() => 'I am Bar';
}

T? getObject<T extends IFace>() {
  // what I'd like to do, but does not work:
  // return T();
  
  // what I have to do instead:
  switch (T) {
    case Bar:
      return Bar() as T;
    default:
      return null;
  }
}


void main() {
  Bar? bar = getObject<Bar>();
  
  print(bar?.foo()); // I am Bar
}

【问题讨论】:

  • 在 Dart 中不可能。一般来说,你不能在 Dart 中使用 Type

标签: flutter class dart types interface


【解决方案1】:

这不是一件容易的事,因为如果 T 没有公共构造函数,或者它有命名构造函数怎么办? ;)

我认为只有使用 dart:mirrors 包才有可能,这在 Flutter 上不可用(由于 AOT 编译)。

您也可以尝试使用reflectable 包,但这也不是一件容易的事。

【讨论】:

  • 确实如此。主要问题是接口不能指定可用的构造函数。所以我们不能静态地确保我们可以调用给定类型的构造函数。
  • 这就是我想要比接口更严格的地方,这样我就可以在“超级接口”中定义一个构造函数,并且实现该“超级接口”的每个类都必须具有相同的构造函数.
  • @Stacky 好吧,你需要重新考虑这个设计,因为这在 Dart 中是不可能的。我也不认为这个功能在其他编程语言中很常见?
  • 除了一些脚本语言,比如 JavaScript,我猜这并不常见。但是泛型类型也不常见。至少不是在过去 10 年左右没有出现的“旧”编程语言中。
  • 这可以通过 C++ 模板实现,但模板的编译方式非常不同。
猜你喜欢
  • 1970-01-01
  • 2019-09-28
  • 2014-02-19
  • 1970-01-01
  • 2018-12-03
  • 1970-01-01
  • 2020-10-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多