Instanz- vs. statische Member
Teil des Abschnitts Objektorientierte Programmierung der Dart-Journey von Coddy — Lektion 17 von 110.
In Dart-Klassen können Member (Variablen und Methoden) entweder zu einzelnen Objekten oder zur Klasse selbst gehören. Das Verständnis dieser Unterscheidung ist grundlegend für die effektive Organisation Ihres Codes.
Instanzmitglieder gehören zu jedem Objekt, das Sie erstellen. Jedes Objekt erhält seine eigene Kopie der Instanzvariablen, und Instanzmethoden operieren auf den Daten dieses spezifischen Objekts:
class Dog {
String name; // Instanzvariable
Dog(this.name);
void bark() { // Instanzmethode
print('$name says woof!');
}
}
Dog dog1 = Dog('Buddy');
Dog dog2 = Dog('Max');
dog1.bark(); // Buddy sagt wuff!
dog2.bark(); // Max sagt wuff!Jedes Dog-Objekt hat seinen eigenen name. Das Ändern des Namens eines Hundes hat keinen Einfluss auf den anderen.
Statische Member gehören zur Klasse selbst, nicht zu einem bestimmten Objekt. Sie werden von allen Instanzen gemeinsam genutzt und über den Klassennamen aufgerufen:
class Dog {
String name;
static int totalDogs = 0; // Statische Variable
Dog(this.name) {
totalDogs++;
}
}
Dog dog1 = Dog('Buddy');
Dog dog2 = Dog('Max');
print(Dog.totalDogs); // 2Die Variable totalDogs wird gemeinsam genutzt – es gibt nur eine Kopie, unabhängig davon, wie viele Dog-Objekte existieren. Sie greifen über den Klassennamen Dog.totalDogs darauf zu, nicht über eine Instanz.
Aufgabe
EinfachLassen Sie uns ein Besucherzählsystem für ein Museum bauen, das sowohl die Besuche einzelner Exponate als auch die Gesamtstatistik des Museums erfasst.
Sie werden Ihren Code in zwei Dateien organisieren:
exhibit.dart: Definieren Sie eine KlasseExhibit, die ein Museumsexponat darstellt. Jedes Exponat sollte Folgendes haben:- Eine Instanzvariable
name(String) für den Namen des Exponats - Eine Instanzvariable
visitorCount(int), die bei0beginnt, um zu verfolgen, wie viele Personen dieses spezifische Exponat besucht haben - Eine statische Variable
totalVisitors(int), die bei0beginnt, um die Gesamtbesuche über alle Exponate hinweg zu verfolgen - Einen Konstruktor, der den Namen des Exponats entgegennimmt
- Eine Methode
recordVisit(), die sowohl denvisitorCountdes Exponats als auch dietotalVisitorsder Klasse erhöht - Eine Methode
displayStats(), die die Informationen des Exponats ausgibt
- Eine Instanzvariable
main.dart: Importieren Sie Ihre Exponat-Klasse und erstellen Sie zwei Exponate:- Ein
'Dinosaur Bones'Exponat - Ein
'Ancient Egypt'Exponat
displayStats()für jedes Exponat in der Reihenfolge ihrer Erstellung auf und geben Sie dann die Gesamtzahl der Besucher über alle Exponate hinweg aus.- Ein
Die Methode displayStats() sollte in genau diesem Format drucken:
[name]: [visitorCount] visitorsFür die Zeile der Gesamtbesucher geben Sie Folgendes aus:
Total museum visitors: [totalVisitors]Greifen Sie auf die statische Variable über den Klassennamen Exhibit.totalVisitors zu.
Erwartete Ausgabe:
Dinosaur Bones: 3 visitors
Ancient Egypt: 2 visitors
Total museum visitors: 5Spickzettel
Klassenmitglieder in Dart können entweder Instanzmitglieder (die zu einzelnen Objekten gehören) oder statische Mitglieder (die zur Klasse selbst gehören) sein.
Instanzmitglieder sind für jedes Objekt eindeutig. Jedes Objekt hat seine eigene Kopie der Instanzvariablen:
class Dog {
String name; // Instanzvariable
Dog(this.name);
void bark() { // Instanzmethode
print('$name says woof!');
}
}Statische Mitglieder werden von allen Instanzen gemeinsam genutzt und über den Klassennamen mit dem Schlüsselwort static aufgerufen:
class Dog {
String name;
static int totalDogs = 0; // Statische Variable
Dog(this.name) {
totalDogs++;
}
}
// Zugriff auf statische Mitglieder über den Klassennamen
print(Dog.totalDogs); // 2Statische Variablen behalten einen einzigen gemeinsamen Wert bei, unabhängig davon, wie viele Objekte erstellt werden.
Probier es selbst
import 'exhibit.dart';
void main() {
// TODO: Erstelle eine 'Dinosaur Bones' Ausstellung
// TODO: Erstelle eine 'Ancient Egypt' Ausstellung
// TODO: Erfasse 3 Besuche für die Dinosaur Bones Ausstellung
// TODO: Erfasse 2 Besuche für die Ancient Egypt Ausstellung
// TODO: Rufe displayStats() für jede Ausstellung in der richtigen Reihenfolge auf
// TODO: Gib die Gesamtzahl der Museumsgäste unter Verwendung von Exhibit.totalVisitors aus
// Format: Total museum visitors: [totalVisitors]
}
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