6

假设我有这样的课程:

abstract class Foo {
  String name bar = 'bar';
}

使用镜像,我们可以得到 的值bar吗?

4

1 回答 1

1

一般答案:

  • super.field如果您正在扩展一个类并想要访问其字段/获取器,则可以使用。
  • 如果您正在反思类声明,则目前无法对任何主体进行自省,包括方法主体或初始化程序。您将不得不使用分析器或 dart2js。
  • Dado 的工作原理很有趣。它试图实例化抽象类,但实际上不再起作用。

既然你在看 Dado,让我来解释一下它是如何工作的,即使它不是这个问题的一般答案。

首先,使用 Dado 的方法过去和现在都是非常实验性的。我试图使用语言特性来要求模块的声明性定义,这样作者就无法编写不能用于代码生成的模块。Dart 和镜像发生了一些变化,使这种方法不太可行,或者至少使它需要更多样板,所以我正在重新考虑整个事情。采取任何你在那里找到的技术,增加一两点盐:)

对于尚未查看示例或代码的其他任何人,在 Dado 中您为模块定义声明一个抽象类。具有值的字段声明一个固定的单例值,类似于更传统的 DI 容器可能让您编写的方式bind(Foo).toValue(new Foo())

我(过去)获取值的方式是通过镜像实例化抽象类,然后简单地读取字段。dart:mirrors 更改为不允许实例化抽象类,因此这不再有效。这是不幸的,因为其他类型的绑定是用抽象方法声明的,而这些绑定会在非抽象类中引起警告。

于 2014-05-19T22:00:59.960 回答