external DateTime._now();
表示 _now() 函数的实现在DateTime类的定义之外。如果您想了解更多关于 Dart 的知识和技能,并且需要帮助,请访问Dart官方文档。
external DateTime._now();
表示 _now() 函数的实现在DateTime类的定义之外。当我们在类内创建像 toString()
这样的外部函数时
external String toString();
这意味着该方法是抽象的,父类的子类将会添加函数体,因为在Dart中我们只能创建抽象类。
总结:
外部函数 = 非抽象类中的抽象函数
我认为关键字external
并不是用于将方法标记为抽象的,即使这是可能的。
只需在抽象类中留下没有实现的方法即可将其设置为抽象方法。
这相当于TypeScript中的declare
和C#中的extern
,它们用于与其他运行时的互操作性,这意味着您告诉编译器:“不要担心此方法的实现,我保证它将在运行时存在”,运行时可以是C、Javascript或任何其他语言。
如果你在想为什么或者在哪里应该使用external
关键字,这里有一个Flutter的例子。
class MyStruct extends Struct {
@Int32()
external int a;
@Float()
external double b;
external Pointer<Void> c;
}
Struct
来访问内存中的本地结构体字段,但不是经常这样做。在 Struct
中,我们必须将所有字段声明为external
,因为这些字段将来自于 dart:ffi
(C / C++)。
所以,external
不仅仅是声明 "抽象方法" 的方式。
https://github.com/dart-lang/sdk/blob/main/sdk/lib/core/string.dart#L711
这是C++的实现。https://github.com/dart-lang/sdk/blob/main/runtime/lib/string.cc#L473-#L478
在我看来,它相当于Java中的native
关键字。例如,由于Android、iOS、Linux等系统对当前时间毫秒数的实现方式不同,DateTime.now().millisecondsSinceEpoch
在运行时将链接到不同的实现。因此,最初不知道这个方法的具体形式。出于这个原因,它被标记为external
,表示它是平台相关的。
外部函数是指其函数体与声明分开提供的函数。外部函数可以是顶级函数(19),方法(10.2,10.8),getter(10.3),setter(10.4)或非重定向构造函数(10.7.1,10.7.2)。外部函数通过内置标识符external(17.38)后跟函数签名来引入。
外部函数允许我们为Dart编译器无法静态知道的代码引入类型信息。
外部函数的示例可能是外部函数(在C或Javascript等中定义),实现的原语(由Dart运行时系统定义)或动态生成的代码,但其接口是静态已知的。然而,抽象方法与外部函数不同,因为它没有函数体。