Menu
Coddy logo textTech

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.

challenge icon

Aufgabe

Einfach

Wir 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 öffentlichen String name und einem privaten int _performanceScore, der mit 50 initialisiert wird. Füge einen Konstruktor hinzu, der den Namen entgegennimmt, sowie einen öffentlichen Getter performanceScore, der den privaten Punktestand zurückgibt.
    • Eine TeamLead-Klasse in derselben Datei, die direkt auf das private Feld von Member zugreifen kann (weil sie sich in derselben Bibliothek befinden). Diese Klasse sollte über einen öffentlichen String name, einen Konstruktor, der den Namen entgegennimmt, und eine Methode evaluateMember(Member member) verfügen, die direkt auf member._performanceScore zugreift, 10 addiert und [leadName] boosted [memberName]'s score to [newScore] ausgibt.
  • main.dart: Importiere deine Teamdatei und veranschauliche den Unterschied beim Zugriff:
    • Erstelle einen Member namens 'Alice'
    • Erstelle einen TeamLead namens 'Bob'
    • Gib Initial score: [score] mithilfe des öffentlichen Getters von Alice aus
    • Lass Bob Alice mithilfe von evaluateMember bewerten
    • Gib Updated score: [score] mithilfe des öffentlichen Getters aus
    • Gib Direct access from main: Not allowed aus (dies erinnert uns daran, dass main.dart nicht direkt auf _performanceScore zugreifen kann, da es sich in einer anderen Bibliothek befindet)

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 allowed

Probier 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
}
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