Bibliotheksweite Sichtbarkeit
Teil des Abschnitts Objektorientierte Programmierung der Dart-Journey von Coddy. Lektion 32 von 110.
In Dart wird die Privatsphäre auf Bibliotheksebene und nicht auf Klassenebene durchgesetzt. Dies ist ein wichtiger Unterschied zu Sprachen wie Java oder C++. Eine Bibliothek in Dart ist typischerweise eine einzelne Datei oder mehrere Dateien, die mit part-Direktiven verbunden sind.
Private Mitglieder (die mit _ beginnen) sind überall innerhalb derselben Bibliothek zugänglich, sogar aus anderen Klassen:
// Beide Klassen in derselben Datei (gleiche Bibliothek)
class Engine {
int _horsepower = 200; // Privat für diese Bibliothek
}
class Car {
void showPower(Engine engine) {
print(engine._horsepower); // Zugänglich! Gleiche Bibliothek
}
}Wenn Sie jedoch eine Klasse aus einer anderen Datei importieren, werden ihre privaten Member wirklich verborgen:
// Datei: engine.dart
class Engine {
int _horsepower = 200;
int get power => _horsepower;
}
// Datei: main.dart
import 'engine.dart';
void main() {
var engine = Engine();
// print(engine._horsepower); // Fehler! Nicht zugänglich
print(engine.power); // Funktioniert - Verwendung des öffentlichen Getters
}Diese Sichtbarkeit auf Bibliotheksebene bedeutet, dass Klassen in derselben Datei eng zusammenarbeiten können, während Implementierungsdetails vor externem Code verborgen bleiben. Es ist eine bewusste Designentscheidung, die dazu anregt, zusammengehörige Klassen in derselben Bibliothek zu organisieren.
Aufgabe
EinfachWir erstellen ein System zur Teamzusammenarbeit, das veranschaulicht, wie der Datenschutz auf Bibliotheksebene in Dart funktioniert. Du wirst sehen, wie Klassen in derselben Datei auf die privaten Member der jeweils anderen zugreifen können, während Code in separaten Dateien dies nicht kann.
Du organisierst deinen Code in zwei Dateien:
team.dart: Diese Datei enthält zwei Klassen, die in derselben Bibliothek eng zusammenarbeiten:- Eine
Member-Klasse mit einem öffentlichenString nameund einem privatenint _performanceScore, der mit50initialisiert wird. Füge einen Konstruktor hinzu, der den Namen entgegennimmt, sowie einen öffentlichen GetterperformanceScore, der den privaten Punktestand zurückgibt. - Eine
TeamLead-Klasse in derselben Datei, die direkt auf das private Feld vonMemberzugreifen kann (weil sie sich in derselben Bibliothek befinden). Diese Klasse sollte über einen öffentlichenString name, einen Konstruktor, der den Namen entgegennimmt, und eine MethodeevaluateMember(Member member)verfügen, die direkt aufmember._performanceScorezugreift,10addiert und[leadName] boosted [memberName]'s score to [newScore]ausgibt.
- Eine
main.dart: Importiere deine Teamdatei und veranschauliche den Unterschied beim Zugriff:- Erstelle einen
Membernamens'Alice' - Erstelle einen
TeamLeadnamens'Bob' - Gib
Initial score: [score]mithilfe des öffentlichen Getters von Alice aus - Lass Bob Alice mithilfe von
evaluateMemberbewerten - Gib
Updated score: [score]mithilfe des öffentlichen Getters aus - Gib
Direct access from main: Not allowedaus (dies erinnert uns daran, dassmain.dartnicht direkt auf_performanceScorezugreifen kann, da es sich in einer anderen Bibliothek befindet)
- Erstelle einen
Die zentrale Erkenntnis hierbei ist, dass TeamLead Members privaten _performanceScore direkt lesen und ändern kann, weil beide Klassen in derselben Datei (derselben Bibliothek) enthalten sind. Code in main.dart muss jedoch den öffentlichen Getter verwenden, da er sich in einer anderen Bibliothek befindet.
Erwartete Ausgabe:
Initial score: 50
Bob boosted Alice's score to 60
Updated score: 60
Direct access from main: Not allowedProbier es selbst
import 'team.dart';
void main() {
// TODO: Erstelle ein Member namens 'Alice'
// TODO: Erstelle einen TeamLead namens 'Bob'
// TODO: Gib "Initial score: [score]" unter Verwendung des öffentlichen Getters für Alice aus
// TODO: Lass Bob Alice mit evaluateMember bewerten
// TODO: Gib "Updated score: [score]" unter Verwendung des öffentlichen Getters aus
// TODO: Gib "Direct access from main: Not allowed" aus
// Note: Wir können hier nicht auf alice._performanceScore zugreifen, da
// main.dart sich in einer anderen Library als team.dart befindet
}
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Objektorientierte Programmierung
1Grundlagen der OOP
Externe DateienBibliotheken & ImportsEinführung in die OOPKlassen vs. ObjekteDas Schlüsselwort thisMethodenInstanzvariablenGrundlagen von KonstruktorenRückblick – Einfacher Taschenrechner4Null-Sicherheit
Einführung in die Null-SicherheitNullable vs. Non-NullableDie Operatoren ? und !Late-Schlüsselwort und Null-SicherheitNull-bewusste OperatorenNull-Sicherheit in KlassenRückblick – Benutzers профilsystem7Abstrakte Klassen & Interfaces
Abstrakte KlassenAbstrakte MethodenInterfaces in DartImplizite InterfacesImplementieren vs. ErweiternMehrere InterfacesZusammenfassung – Formrechner10Collections & Generics
Übersicht über List, Set und MapTypsichere CollectionsGenerische KlassenGenerische MethodenGenerische EinschränkungenIterable & IteratorRückblick – Generischer Speicher13Fortgeschrittene OOP-Konzepte
Komposition vs. VererbungErweiterungsmethodenAufrufbare KlassenVersiegelte Klassen (Dart 3)Records (Dart 3)Muster & Matching (3.0)Enums mit Methoden16Projekt: Bibliotheksverwaltung
ProjektübersichtBuch- und Benutzerklassen2Konstruktoren in Dart
StandardkonstruktorBenannte KonstruktorenInitialisierungslistenKonstantenkonstruktorenFactory-KonstruktorenWeiterleitende KonstruktorenRückblick – Shape Builder5Kapselung
Öffentliche vs. private MemberDie _-Präfix-KonventionBibliotheksweite SichtbarkeitTiefergehende Getter & SetterInformationsverbergungRückblick – Studierendendaten8Mixins
Einführung in MixinsMixins erstellenMehrere Mixins verwendenDas Schlüsselwort „on“ in MixinsMixin vs. VererbungMixin vs. SchnittstelleRückblick – Tiersystem11Spezielle Methoden
toString()-ÜberschreibunghashCode- & ==-ÜberschreibungComparable-Schnittstellecall()-MethodenoSuchMethod-ÜberschreibungWiederholung – Benutzerdefinierte Collection14Entwurfsmuster Teil 1
Einführung in EntwurfsmusterSingleton-MusterFabrikmusterBeobachtermusterStrategiemuster17Abschließende Herausforderungen
E-Learning-PlattformBankingsystemSpielcharaktersystemFahrzeugvermietung3Klassen-Eigenschaften
Instanz- vs. statische MemberFinal- und Const-FelderLate-VariablenStatische Methoden und FelderGetter und SetterRückblick – Bankkontoverwaltung6Vererbung
Grundlegende VererbungDas Schlüsselwort superMethodenüberschreibungDie Annotation @overrideDas Schlüsselwort final für KlassenKonstruktoren und VererbungZusammenfassung – Mitarbeiterhierarchie9Polymorphismus
Grundlagen des PolymorphismusPolymorphismus über InterfacesLaufzeit-TypüberprüfungDie Operatoren is & asCovariant-SchlüsselwortZusammenfassung – ZahlungsprozessorÜbe selbstständig: Online-Dart-Compiler