你如何命名Dart类?

Bra*_*ath 24 namespaces dart

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

你如何在达特实现同样的目标?

Chr*_*ett 56

Dart没有命名空间的概念,但它有库.您可以将库视为等同于命名空间,因为库可以由多个文件组成,并包含多个类和函数.

Dart中的隐私也在库中,而不是类级别(任何带有下划线的前缀都是该库的私有).

定义库的示例(使用实用程序库的示例:

// utilities.dart
library utilities; // being the first statement in the library file
Run Code Online (Sandbox Code Playgroud)

您可以使用part关键字将其他文件作为同一个库的一部分.零件文件仅用于帮助组织代码; 您可以将所有类放在单个库文件中,也可以将它们分成几个部分文件(或部分文件和库文件) - 它对执行没有影响.将主库文件放在父文件夹中,将部分文件放在src/文件夹中是风格化的.

展开示例以显示零件文件.

// utilities.dart
library utilities;

part "src/string_utils.dart";
part "src/date_utils.dart";
Run Code Online (Sandbox Code Playgroud)

然后,这些部分文件使用以下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
Run Code Online (Sandbox Code Playgroud)

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

 // 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
 }
Run Code Online (Sandbox Code Playgroud)

如果要对库进行别名以避免冲突(可能导入两个包含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");
 }
Run Code Online (Sandbox Code Playgroud)

import语句还使用由Dart的包管理器pub导入的包,因此您也可以在github或其他地方托管您的库,并引用您的库,如下所示:

 // my_app.dart;
 import "package:utilities/utilities.dart";

 main() {
   var reversed = reverseString("Foo");        
 }
Run Code Online (Sandbox Code Playgroud)

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....?
 }
Run Code Online (Sandbox Code Playgroud)

  • 应该注意的是,不建议使用`part`指令。*“注意:您可能听说过part指令,它允许您将一个库拆分为多个Dart文件。我们建议您避免使用part并创建小型库。” *-https://www.dartlang。 org / guides / libraries / create-library-packages (2认同)
  • `part` 现在是代码生成工具的参考 (2认同)
  • 您能否解释一下有关dart的“库”的长期故事如何解决名称空间?基于https://en.wikipedia.org/wiki/Namespace我仍然看不到它 (2认同)