Подтвердить что ты не робот

Как вы проецируете пространство Dart?

Как создать пространство имен для класса Dart? Я исхожу из фона С#, где можно просто использовать namespace SampleNamespace { }.

Как вы достигаете того же в Дарте?

4b9b3361

Ответ 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

Теперь, когда у вас есть библиотека, содержащая функцию, вы можете использовать эту библиотеку в другом месте 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
 }

Если вы хотите использовать псевдоним вашей библиотеки, чтобы избежать столкновений (там, где вы могли бы импортировать две библиотеки, содержащие функцию 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, поэтому вы также можете разместить свою библиотеку в 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....?
 }