Die _ Präfix-Konvention
Teil des Abschnitts Objektorientierte Programmierung der Dart-Journey von Coddy — Lektion 31 von 110.
Der Unterstrich-Präfix _ ist Darts Methode, um Member als privat zu kennzeichnen. Im Gegensatz zu Sprachen, die Schlüsselwörter wie private verwenden, verlässt sich Dart auf diese Namenskonvention, um die Sichtbarkeit zu steuern.
Sie können den Unterstrich sowohl auf Felder als auch auf Methoden anwenden:
class Counter {
int _count = 0; // Privates Feld
void _increment() { // Private Methode
_count++;
}
void increase() { // Öffentliche Methode
_increment();
print('Count: $_count');
}
}Der Unterstrich funktioniert für jeden Bezeichner – Variablen, Methoden, Getter, Setter und sogar Klassennamen. Eine Klasse namens _Helper wäre privat für ihre Bibliothek.
class Person {
String _name; // Privat
int _age; // Privat
Person(this._name, this._age);
String get name => _name; // Öffentlicher Getter
void _validateAge(int age) { } // Private Methode
}Innerhalb derselben Klasse greifen Sie ganz normal auf private Member zu. Die Einschränkung gilt nur für Code außerhalb der Bibliothek. Diese Konvention macht beim Lesen von Code sofort deutlich, welche Member nur für den internen Gebrauch bestimmt sind – alles, was mit _ beginnt, ist ein Implementierungsdetail.
Aufgabe
EinfachLassen Sie uns einen Punktestand-Tracker für ein Spiel erstellen, der zeigt, wie das Unterstrich-Präfix interne Implementierungsdetails verbirgt, während eine saubere öffentliche Schnittstelle bereitgestellt wird.
Sie werden Ihren Code in zwei Dateien organisieren:
score_tracker.dart: Erstellen Sie eineScoreTracker-Klasse, die den Punktestand eines Spielers mit ordnungsgemäßer Kapselung verwaltet. Die Klasse sollte Folgendes haben:- Ein öffentliches
String playerName- jeder kann sehen, wer spielt - Ein privates
int _score, initialisiert mit0- der rohe Punktestand sollte geschützt sein - Ein privates
int _bonusMultiplier, initialisiert mit1- dies ist eine interne Spielmechanik - Einen Konstruktor, der den Spielernamen entgegennimmt
- Einen öffentlichen Getter
score, der das private_scorezurückgibt - Eine private Methode
_applyBonus(int points), diepoints * _bonusMultiplierzurückgibt - Eine öffentliche Methode
addPoints(int points), die intern_applyBonusverwendet, um die tatsächlich hinzugefügten Punkte zu berechnen,_scoreaktualisiert undAdded [calculated] points!ausgibt - Eine öffentliche Methode
activateDoubleBonus(), die_bonusMultiplierauf2setzt undDouble bonus activated!ausgibt - Eine öffentliche Methode
displayStats(), die den aktuellen Status des Spielers anzeigt
- Ein öffentliches
main.dart: Importieren Sie Ihren Punktestand-Tracker und simulieren Sie eine Spielsitzung:- Erstellen Sie einen
ScoreTrackerfür den Spieler'Alex' - Rufen Sie
displayStats()auf - Fügen Sie
10Punkte hinzu - Fügen Sie
25Punkte hinzu - Aktivieren Sie den Doppelbonus
- Fügen Sie
15Punkte hinzu (dies sollte verdoppelt werden) - Rufen Sie
displayStats()auf - Geben Sie
Final score: [score]unter Verwendung des öffentlichen Getters aus
- Erstellen Sie einen
Die Methode displayStats() sollte in diesem Format drucken:
=== Player Stats ===
Player: [playerName]
Current Score: [_score]Beachten Sie, wie die private Methode _applyBonus und das Feld _bonusMultiplier die Bonusberechnung intern handhaben. Externer Code sieht nur die öffentlichen Methoden und hat keine Ahnung vom Multiplikatorsystem - das ist ein Implementierungsdetail, das hinter der Unterstrich-Konvention verborgen ist.
Erwartete Ausgabe:
=== Player Stats ===
Player: Alex
Current Score: 0
Added 10 points!
Added 25 points!
Double bonus activated!
Added 30 points!
=== Player Stats ===
Player: Alex
Current Score: 65
Final score: 65Spickzettel
Der Unterstrich-Präfix _ kennzeichnet Member in Dart als privat. Diese Namenskonvention steuert die Sichtbarkeit, ohne Schlüsselwörter wie private zu verwenden.
Wenden Sie den Unterstrich auf Felder und Methoden an:
class Counter {
int _count = 0; // Private field
void _increment() { // Private method
_count++;
}
void increase() { // Public method
_increment();
print('Count: $_count');
}
}Der Unterstrich funktioniert für jeden Bezeichner - Variablen, Methoden, Getter, Setter und Klassennamen:
class Person {
String _name; // Private
int _age; // Private
Person(this._name, this._age);
String get name => _name; // Public getter
void _validateAge(int age) { } // Private method
}Private Member sind innerhalb derselben Klasse zugänglich, aber für Code außerhalb der Library eingeschränkt. Alles, was mit _ beginnt, ist ein Implementierungsdetail.
Probier es selbst
import 'score_tracker.dart';
void main() {
// TODO: Erstelle einen ScoreTracker für Spieler 'Alex'
// TODO: Rufe displayStats() auf
// TODO: Füge 10 Punkte hinzu
// TODO: Füge 25 Punkte hinzu
// TODO: Aktiviere den doppelten Bonus
// TODO: Füge 15 Punkte hinzu (dies sollte verdoppelt werden)
// TODO: Rufe displayStats() auf
// TODO: Gib 'Final score: [score]' unter Verwendung des öffentlichen Getters 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 this-SchlüsselwortMethodenInstanzvariablenKonstruktor-GrundlagenWiederholung – Einfacher Taschenrechner4Null-Sicherheit
Einführung in Null-SicherheitNullable vs. Non-NullableDie ? und ! OperatorenLate-Schlüsselwort & Null-SicherheitNull-aware OperatorenNull-Sicherheit in KlassenZusammenfassung – Benutzerprofil-System7Abstrakte Klassen & Interfaces
Abstrakte KlassenAbstrakte MethodenInterfaces in DartImplizite InterfacesImplementieren vs. ErweiternMehrfache InterfacesRückblick – Shape Calculator10Collections & Generics
Überblick über List, Set und MapTypsichere CollectionsGenerische KlassenGenerische MethodenGenerische ConstraintsIterable & IteratorZusammenfassung – Generische Speicherung13Fortgeschrittene OOP-Konzepte
Komposition vs. VererbungExtension MethodsCallable ClassesSealed Classes (Dart 3)Records (Dart 3)Patterns & Matching (3.0)Enums mit Methoden16Projekt: Bibliotheksverwaltung
ProjektübersichtBuch- und Benutzerklassen2Konstruktoren in Dart
Standard-KonstruktorBenannte KonstruktorenInitialisierungslistenKonstante KonstruktorenFactory-KonstruktorenWeiterleitende KonstruktorenZusammenfassung – Shape Builder5Kapselung
Öffentliche vs. private MemberDie _ Präfix-KonventionSichtbarkeit auf Library-EbeneGetter & Setter im DetailInformation HidingRückblick – Schülerdatensätze8Mixins
Einführung in MixinsMixins erstellenMehrere Mixins verwendenDas on-Schlüsselwort in MixinsMixin vs. VererbungMixin vs. InterfaceZusammenfassung - Tiersystem11Spezielle Methoden
toString() überschreibenhashCode & == überschreibenComparable-Interfacecall()-MethodenoSuchMethod überschreibenZusammenfassung – Eigene Collection14Entwurfsmuster Teil 1
Einführung in EntwurfsmusterSingleton-MusterFactory-MusterObserver-MusterStrategy-Muster3Klasseneigenschaften
Instanz- vs. statische MemberFinal & Const FelderLate-VariablenStatische Methoden & FelderGetter und SetterZusammenfassung – Bankkonto-Manager6Vererbung
Grundlagen der VererbungDas super-SchlüsselwortMethoden überschreibenDie @override-AnnotationDas final-Klassen-SchlüsselwortKonstruktoren & VererbungRückblick – Mitarbeiter-Hierarchie9Polymorphismus
Polymorphismus-GrundlagenPolymorphismus über InterfacesTypprüfung zur LaufzeitDie is & as OperatorenDas covariant SchlüsselwortZusammenfassung – Payment Processor