我在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;
}
答案 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这样的面向对象的语言要好。)