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キーワードを使用して、他のファイルを同じライブラリの一部にすることができます。パーツ ファイルは、コードを整理するためにのみ使用されます。すべてのクラスを 1 つのライブラリ ファイルに入れることも、複数のパーツ ファイル (またはパーツ ファイルとライブラリ ファイル) に分割することもできます。実行には影響しません。メイン ライブラリ ファイルを親フォルダーに配置し、パーツ ファイルをフォルダーに配置するのがスタイルです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()衝突を避けるためにライブラリにエイリアスを設定する場合 (関数を含む 2 つのライブラリをインポートする場合は、次の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");        
 }

pubspec.yamlpub の依存関係はファイルで定義され、ライブラリの場所を pub に指示します。詳細については、pub.dartlang.orgをご覧ください。

ライブラリ ファイルのみが次のことができることに注意することが重要です。

  • ステートメントが含まれていますimport。パーツ ファイルはできません。
  • libraryキーワードが含まれています。パーツ ファイルはできません。
  • ファイルが含まれていpartます。パーツ ファイルはできません。

最後の 1 つのポイントは、実行可能なアプリ ファイルはライブラリ ファイルである可能性があり (そうである可能性が高い)、パーツ ファイルで構成することもできるということです。

 // 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 に答える