Wie erstellt man einen Namespace für eine Dart-Klasse? Ich komme aus einem C#-Hintergrund, wo man einfach namespace SampleNamespace { }
.
Wie erreicht man dasselbe in Dart?
Wie erstellt man einen Namespace für eine Dart-Klasse? Ich komme aus einem C#-Hintergrund, wo man einfach namespace SampleNamespace { }
.
Wie erreicht man dasselbe in Dart?
Dart verfügt nicht über das Konzept der Namespaces, sondern über Bibliotheken. Sie können eine Bibliothek als eine Art Äquivalent zu einem Namespace betrachten, da eine Bibliothek aus mehreren Dateien bestehen und mehrere Klassen und Funktionen enthalten kann.
Die Privatsphäre in Dart ist auch auf der Bibliotheksebene und nicht auf der Klassenebene angesiedelt (alles, dem ein Unterstrich vorangestellt ist, ist für diese Bibliothek privat).
Ein Beispiel für die Definition einer Bibliothek (am Beispiel einer Dienstprogramm-Bibliothek:
// utilities.dart
library utilities; // being the first statement in the library file
Sie können andere Dateien zu einem Teil derselben Bibliothek machen, indem Sie die part
Stichwort. Sie können alle Klassen in eine einzige Bibliotheksdatei packen oder sie auf mehrere Teildateien (oder Teildateien und die Bibliotheksdatei) aufteilen - es hat keinen Einfluss auf die Ausführung. Es ist stilvoll, die Hauptbibliotheksdatei in einen übergeordneten Ordner zu legen und die Teildateien in einen src/
Ordner.
Erweitern Sie das Beispiel, um die Teildateien anzuzeigen.
// utilities.dart
library utilities;
part "src/string_utils.dart";
part "src/date_utils.dart";
Diese Teildateien verweisen dann auf die Bibliothek, zu der sie gehören, indem sie die part of
Erklärung:
// 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
Da Sie nun eine Bibliothek haben, die eine Funktion enthält, können Sie diese Bibliothek an anderer Stelle verwenden, indem Sie import
in der Bibliothek:
// 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
}
Wenn Sie Ihre Bibliothek mit einem Alias versehen wollen, um Konflikte zu vermeiden (wenn Sie zwei Bibliotheken importieren, die beide ein reverseString()
verwenden Sie die Funktion as
Stichwort:
// 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");
}
Die import-Anweisung macht auch Gebrauch von Paketen, wie sie von pub, dem Paketmanager von Dart, importiert werden, so dass Sie Ihre Bibliothek auch auf github oder anderswo hosten und so auf Ihre Bibliothek verweisen können:
// my_app.dart;
import "package:utilities/utilities.dart";
main() {
var reversed = reverseString("Foo");
}
Die Pub-Abhängigkeit wird in einer pubspec.yaml
Datei, die pub mitteilt, wo die Bibliothek zu finden ist. Weitere Informationen finden Sie unter pub.dartlang.org
Es ist wichtig zu beachten, dass nur die Bibliotheksdatei dies kann:
import
Erklärungen. Teil-Dateien nicht.library
Stichwort. Teil-Dateien nicht.part
Dateien. Teil-Dateien nicht.Ein letzter Punkt ist, dass eine lauffähige Anwendungsdatei eine Bibliotheksdatei sein kann (und wahrscheinlich auch sein wird) und auch aus Teildateien bestehen kann
// 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....?
}
Der einfachste Weg, den ich gefunden habe, um einen Namespace in Dart zu erstellen, ist dieser:
Angenommen, Sie haben die Dateien a.dart und b.dart, die die Klassen Apple bzw. Banana enthalten. Erstellen Sie eine Datei namens my_namespace.dart. In diesem Beispiel befindet sie sich im selben Ordner wie die beiden anderen Dateien. Exportieren Sie alle Dateien, die Sie unter Ihrem Namensraum haben wollen, aus der Datei my_namespace.dart:
export 'a.dart';
export 'b.dart';
Wenn Sie den exportierten Code aus diesen beiden Dateien verwenden möchten, können Sie dies tun:
import 'my_namespace.dart' as my_namespace;
// you can now access the classes under the same namespace:
final myApple = my_namespace.Apple();
final myBanana = my_namespace.Banana();
Eine andere Möglichkeit, die die Zwischendatei my_namespace.dart überflüssig macht, besteht darin, mehrere Importanweisungen mit demselben Alias zu verwenden:
import 'a.dart' as my_namespace;
import 'b.dart' as my_namespace;
// you can once again access the classes under the same namespace:
final myApple = my_namespace.Apple();
final myBanana = my_namespace.Banana();
Ich bevorzuge die erste Methode, da ich nicht jedes Mal, wenn ich eine Klasse aus dem Namespace verwenden möchte, mehrere Importanweisungen wiederholen muss.
Natürlich müssen sich die importierten und die exportierten Dateien nicht im selben Ordner befinden, aber es wäre wahrscheinlich praktischer, wenn die Dateien unter demselben Namensraum im selben Ordner liegen würden.
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.