有没有一种方法可以在Dart中直接在类上添加静态扩展方法?

时间:2020-01-13 22:39:59

标签: dart extension-methods

我在comment中读到一个有关C#的类似问题,即只能从实例中调用扩展方法。 Dart也是如此吗?我正在尝试将吸气剂添加到Platform class中,就像这样。 Platform.isDesktop。但是,这仅在调用类的实例(即Platform().isDesktop)时有效,即使将实例方法声明为静态方法也是如此。为什么我们不能添加静态成员?

代码:

extension on Platform {
  bool get isMobile => Platform.isAndroid || Platform.isIOS;
  bool get isDesktop => Platform.isWindows || Platform.isMacOS || Platform.isLinux;
}

2 个答案:

答案 0 :(得分:10)

是的,Dart也是如此。扩展方法的作用类似于实例方法,而不是静态方法。当前无法从类外部向类添加静态方法。

您可以在扩展中声明静态方法,但是它们在扩展本身上是静态的(您可以使用ExtensionName.methodName()进行调用)。

正在讨论有关在https://github.com/dart-lang/language/issues/723中添加扩展静态方法的问题。

答案 1 :(得分:1)

就像C#一样,Dart不支持静态扩展成员。

原因是扩展成员是静态成员的语法糖。例如,假设您具有以下条件:

extension IntAdder on int {
  int add(int other) => this + other;
}

如果要调用此扩展方法,则:

var a = 5;
var b = a.add(3);
// b = 8

编译器获取以下代码,并将其转换为实际上将最终存储在字节码中的逻辑:

var a = 5;
// Transformed into the static equivalent, where 
// "this" in the extension method becomes the value of a
var b = IntAdder.add(a, 3); 
// b = 8;

实际上,扩展本身的编译形式类似于以下内容:

class IntAdder {
  static int add(int $this, int other) => $this + other;
}

知道这一点,当扩展方法已经隐式静态时,将如何实现 static 扩展方法?将“实例”方法转换为静态方法很容易,但是在静态上下文中将成员动态插入类型本身并不那么简单。

(有理由说,像Swift和Javascript这样的原型语言在这些方面比C#和Dart这样的面向对象的语言要好。)

相关问题