如何为 Dart 类创建命名空间?我来自 C# 背景,人们只会使用namespace SampleNamespace { }
.
你如何在 Dart 中达到同样的效果?
如何为 Dart 类创建命名空间?我来自 C# 背景,人们只会使用namespace SampleNamespace { }
.
你如何在 Dart 中达到同样的效果?
Dart 没有命名空间的概念,但它有库。您可以认为库在某种程度上等同于命名空间,因为库可以由多个文件组成,并包含多个类和函数。
Dart 中的隐私也在库中,而不是在类级别(任何带有下划线前缀的东西都是该库私有的)。
定义库的示例(使用实用程序库的示例:
// utilities.dart
library utilities; // being the first statement in the library file
part
您可以使用关键字使其他文件成为同一库的一部分。零件文件仅用于帮助组织您的代码;您可以将所有类放在一个库文件中,或者将它们拆分为几个部分文件(或部分文件和库文件) - 它对执行没有影响。将主库文件放在父文件夹中,将部分文件放在src/
文件夹中是一种风格。
扩展示例以显示零件文件。
// utilities.dart
library utilities;
part "src/string_utils.dart";
part "src/date_utils.dart";
然后,这些部分文件使用以下part of
语句链接回它们所属的库:
// src/string_utils.dart
part of utilities;
// functions and classes
String reverseString(s) => // implementation ....
String _stringBuilder(strings) => // a private (to the library) function,
// indicated by the leading underscore
//... snip other classes and functions
现在您有了一个包含函数的库,您可以通过import
ing 库在其他地方使用该库:
// my_app.dart;
import "path/to/library/utilities.dart";
main() {
var reversed = reverseString("Foo");
// _stringBulider(["a","b"]); // won't work - this function is
// only visible inside the library
}
如果你想给你的库起别名以避免冲突(你可能会导入两个库,都包含一个reverseString()
函数,你可以使用as
关键字:
// my_app.dart;
import "path/to/library/utilities.dart";
import "some/other/utilities.dart" as your_utils;
main() {
var reversed = reverseString("Foo");
var your_reversed_string = your_utils.reverseString("Bar");
}
import 语句还使用了由 Dart 的包管理器 pub 导入的包,因此您也可以在 github 或其他地方托管您的库,并像这样引用您的库:
// my_app.dart;
import "package:utilities/utilities.dart";
main() {
var reversed = reverseString("Foo");
}
pub 依赖项在一个pubspec.yaml
文件中定义,该文件告诉 pub 在哪里可以找到库。您可以在pub.dartlang.org找到更多信息
需要注意的是,只有库文件可以:
import
语句。零件文件不能。library
关键字。零件文件不能。part
文件。零件文件不能。最后一点是,可运行的应用程序文件可以(并且可能是)库文件,也可以由部分文件组成
// my_app.dart;
library my_app;
import "package:utilities/utilities.dart";
part "src/edit_ui.dart";
part "src/list_ui.dart";
part "src/foo.dart";
main() {
var reversed = reverseString("Foo");
showEditUi(); // perhaps defined in edit_ui.dart....?
}