Menu
Coddy logo textTech

Ö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.

challenge icon

Aufgabe

Einfach

Erstellen 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 eine Credential-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 _password zurü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)
  • 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ßend Actual password length: [length] aus, wobei du über den öffentlichen Getter auf die Länge des Passworts zugreifst

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: 6

Probier 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
}
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Objektorientierte Programmierung

Übe selbstständig: Online-Dart-Compiler