Öffentliche vs. private Member
Teil des Abschnitts Objektorientierte Programmierung der Dart-Journey von Coddy. Lektion 30 von 110.
Kapselung ist eines der Kernprinzipien der objektorientierten Programmierung. Es geht darum, den Zugriff auf die internen Daten einer Klasse zu steuern und zu entscheiden, was nach außen hin sichtbar sein soll und was verborgen bleiben muss.
In Dart sind Klassenmitglieder (Felder und Methoden) standardmäßig öffentlich. Das bedeutet, dass jeder Code direkt auf sie zugreifen kann:
class BankAccount {
String owner;
double balance;
BankAccount(this.owner, this.balance);
}
var account = BankAccount('Alice', 1000);
account.balance = -500; // Jeder kann dies direkt ändern!Das ist problematisch. Nichts verhindert das Festlegen eines ungültigen Kontostands.
Zum Schutz interner Daten verwendet Dart private Member. Ein Member wird privat, wenn sein Name mit einem Unterstrich _ beginnt:
class BankAccount {
String owner;
double _balance; // Privat - beginnt mit Unterstrich
BankAccount(this.owner, this._balance);
double get balance => _balance; // Kontrollierter Zugriff
}Jetzt kann auf _balance nicht mehr direkt von außerhalb der Bibliothek zugegriffen werden, in der die Klasse definiert ist. Externer Code muss stattdessen den öffentlichen Getter verwenden. Dies ermöglicht es Ihnen zu kontrollieren, wie Daten gelesen und geändert werden, und stellt sicher, dass Ihre Objekte immer in einem gültigen Zustand bleiben.
Aufgabe
EinfachErstellen wir einen einfachen Passwortmanager, der den Unterschied zwischen öffentlichen und privaten Mitgliedern veranschaulicht. Du wirst sehen, wie das Präfix mit Unterstrich sensible Daten davor schützt, direkt von außerhalb der Klassenbibliothek auf sie zuzugreifen.
Du wirst zwei Dateien erstellen, um deinen Code zu organisieren:
credential.dart: Definiere eineCredential-Klasse, die Anmeldeinformationen für eine Website speichert. Die Klasse sollte Folgendes enthalten:- Eine öffentliche
String website– es ist in Ordnung, wenn jeder sehen kann, für welche Website sie bestimmt ist - Eine öffentliche
String username– der Benutzername darf sichtbar sein - Eine private
String _password– das tatsächliche Passwort muss geschützt werden - Einen Konstruktor, der alle drei Werte entgegennimmt
- Eine öffentliche Getter-Methode
password, die das private_passwordzurückgibt (kontrollierter Zugriff) - Eine Methode
getMaskedPassword(), die das Passwort zurückgibt, wobei alle Zeichen durch Sternchen*ersetzt werden (mit derselben Länge wie das tatsächliche Passwort) - Eine Methode
displayCredential(), die die Anmeldeinformationen sicher ausgibt (das maskierte Passwort und nicht das echte)
- Eine öffentliche
main.dart: Importiere deine Credential-Klasse und zeige, wie die Kapselung das Passwort schützt:- Erstelle eine Anmeldeinformation für die Website
'github.com', den Benutzernamen'dev_user'und das Passwort'secret123' - Erstelle eine weitere Anmeldeinformation für die Website
'email.com', den Benutzernamen'john_doe'und das Passwort'myP@ss' - Rufe für jede Anmeldeinformation
displayCredential()auf und gib anschließendActual password length: [length]aus, wobei du über den öffentlichen Getter auf die Länge des Passworts zugreifst
- Erstelle eine Anmeldeinformation für die Website
Die Methode displayCredential() sollte in diesem Format ausgeben:
--- Credential ---
Website: [website]
Username: [username]
Password: [maskedPassword]Erwartete Ausgabe:
--- Credential ---
Website: github.com
Username: dev_user
Password: *********
Actual password length: 9
--- Credential ---
Website: email.com
Username: john_doe
Password: ******
Actual password length: 6Probier es selbst
import 'credential.dart';
void main() {
// TODO: Erstelle ein Credential für github.com
// website: 'github.com', username: 'dev_user', password: 'secret123'
// TODO: Rufe displayCredential() für das erste Credential auf
// TODO: Gib die tatsächliche Passwortlänge über den öffentlichen Getter aus
// Format: "Actual password length: [length]"
// TODO: Erstelle ein Credential für email.com
// website: 'email.com', username: 'john_doe', password: 'myP@ss'
// TODO: Rufe displayCredential() für das zweite Credential auf
// TODO: Gib die tatsächliche Passwortlänge über den öffentlichen Getter aus
}
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