37

如何为 Dart 类创建命名空间?我来自 C# 背景,人们只会使用namespace SampleNamespace { }.

你如何在 Dart 中达到同样的效果?

4

1 回答 1

78

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

现在您有了一个包含函数的库,您可以通过importing 库在其他地方使用该库:

 // 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....?
 }
于 2012-12-14T13:38:03.097 回答