【问题标题】:How do you namespace a Dart class?你如何命名一个 Dart 类?
【发布时间】:2012-12-02 08:21:31
【问题描述】:

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

你如何在 Dart 中实现同样的目标?

【问题讨论】:

    标签: namespaces dart


    【解决方案1】:

    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....?
     }
    

    【讨论】:

    • 应该注意的是,不鼓励使用part 指令。 "注意:您可能听说过 part 指令,它允许您将一个库拆分为多个 Dart 文件。我们建议您避免使用 part 并改为创建迷你库。" -- dartlang.org/guides/libraries/create-library-packages
    • part 现在是代码生成工具的参考
    • 您能否解释一下您关于 dart 的 library 的长篇故事是如何解决命名空间的?基于en.wikipedia.org/wiki/Namespace我还是看不到
    • @jerinho.com - 你一定错过了那句话:“是一个抽象的容器或环境,用于保存......的逻辑分组”。所以类是逻辑分组数据的容器,命名空间用于逻辑分组类。这就是他向我们展示如何在飞镖中做的事情。
    猜你喜欢
    • 2010-10-30
    • 1970-01-01
    • 2010-09-19
    • 1970-01-01
    • 1970-01-01
    • 2010-09-12
    • 1970-01-01
    • 2016-01-07
    • 2013-05-09
    相关资源
    最近更新 更多