Menu
Coddy logo textTech

Sichtbarkeit auf Library-Ebene

Teil des Abschnitts Objektorientierte Programmierung der Dart-Journey von Coddy — Lektion 32 von 110.

In Dart wird die Privatsphäre auf der Library-Ebene erzwungen, nicht auf der Klassenebene. Dies ist ein wesentlicher Unterschied zu Sprachen wie Java oder C++. Eine Library in Dart ist normalerweise eine einzelne Datei oder mehrere Dateien, die mit part-Direktiven verbunden sind.

Private Member (solche, die mit _ beginnen) sind überall innerhalb derselben Bibliothek zugänglich, sogar von anderen Klassen aus:

// Beide Klassen in derselben Datei (dieselbe Bibliothek)
class Engine {
  int _horsepower = 200;  // Privat für diese Bibliothek
}

class Car {
  void showPower(Engine engine) {
    print(engine._horsepower);  // Zugänglich! Dieselbe 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

Lassen Sie uns ein Team-Zusammenarbeitssystem erstellen, das zeigt, wie der Datenschutz auf Bibliotheksebene in Dart funktioniert. Sie werden 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.

Sie werden Ihren Code in zwei Dateien organisieren:

  • 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ügen Sie einen Konstruktor hinzu, der den Namen entgegennimmt, und einen öffentlichen Getter performanceScore, der den privaten Score zurückgibt.
    • Eine TeamLead-Klasse in derselben Datei, die direkt auf das private Feld von Member zugreifen kann (da sie sich in derselben Bibliothek befinden). Diese Klasse sollte einen öffentlichen String name haben, einen Konstruktor, der den Namen entgegennimmt, und eine Methode evaluateMember(Member member), die direkt auf member._performanceScore zugreift, 10 dazu addiert und [leadName] boosted [memberName]'s score to [newScore] ausgibt.
  • main.dart: Importieren Sie Ihre Team-Datei und demonstrieren Sie den Unterschied beim Zugriff:
    • Erstellen Sie ein Member namens 'Alice'
    • Erstellen Sie einen TeamLead namens 'Bob'
    • Geben Sie Initial score: [score] unter Verwendung des öffentlichen Getters für Alice aus
    • Lassen Sie Bob Alice mit evaluateMember bewerten
    • Geben Sie Updated score: [score] unter Verwendung des öffentlichen Getters aus
    • Geben Sie 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 entscheidende Erkenntnis hierbei ist, dass TeamLead den privaten _performanceScore von Member direkt lesen und ändern kann, da beide Klassen in derselben Datei (derselben Bibliothek) liegen. 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

Spickzettel

In Dart wird der Zugriffsschutz auf der Library-Ebene erzwungen, nicht auf der Klassenebene. Eine Library ist normalerweise eine einzelne Datei oder mehrere Dateien, die mit part-Direktiven verbunden sind.

Private Member beginnen mit einem Unterstrich (_) und sind überall innerhalb derselben Library zugänglich, sogar von anderen Klassen aus:

// Beide Klassen in derselben Datei (gleiche Library)
class Engine {
  int _horsepower = 200;  // Privat für diese Library
}

class Car {
  void showPower(Engine engine) {
    print(engine._horsepower);  // Zugänglich! Gleiche Library
  }
}

Wenn Sie eine Klasse aus einer anderen Datei importieren, werden ihre privaten Member verborgen:

// file: engine.dart
class Engine {
  int _horsepower = 200;
  int get power => _horsepower;
}

// file: 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
}

Dieses Design fördert die Organisation zusammengehöriger Klassen in derselben Library, sodass sie eng zusammenarbeiten können, während Implementierungsdetails vor externem Code verborgen bleiben.

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