Menu
Coddy logo textTech

Getter und Setter

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

Getter und Setter bieten eine Möglichkeit, auf Klassenfelder über spezielle Methoden zuzugreifen und diese zu ändern, die wie reguläre Eigenschaften aussehen. Anstatt Felder direkt offenzulegen, können Sie steuern, wie Werte gelesen und geschrieben werden.

Ein Getter wird mit dem Schlüsselwort get definiert und gibt einen berechneten oder gespeicherten Wert zurück:

class Rectangle {
  double width;
  double height;
  
  Rectangle(this.width, this.height);
  
  double get area => width * height;
  double get perimeter => 2 * (width + height);
}

Rectangle rect = Rectangle(5, 3);
print(rect.area);      // 15.0
print(rect.perimeter); // 16.0

Beachten Sie, dass auf area und perimeter wie auf Felder zugegriffen wird, sie aber jedes Mal neu berechnet werden. Keine Klammern erforderlich.

Ein Setter verwendet das Schlüsselwort set und ermöglicht es Ihnen zu steuern, wie ein Wert zugewiesen wird:

class Temperature {
  double _celsius;
  
  Temperature(this._celsius);
  
  double get celsius => _celsius;
  set celsius(double value) {
    if (value >= -273.15) {
      _celsius = value;
    }
  }
  
  double get fahrenheit => _celsius * 9 / 5 + 32;
  set fahrenheit(double value) {
    celsius = (value - 32) * 5 / 9;
  }
}

Temperature temp = Temperature(25);
print(temp.fahrenheit);  // 77.0
temp.fahrenheit = 100;
print(temp.celsius);     // 37.78

Der Setter validiert die Eingabe, bevor er sie speichert, und kann sogar zwischen Einheiten umrechnen. Dies gibt Ihnen die Kontrolle über Ihre Daten, während eine saubere, eigenschaftsähnliche Syntax für die Benutzer Ihrer Klasse beibehalten wird.

challenge icon

Aufgabe

Einfach

Lass uns einen Score-Tracker für ein Spiel bauen, der Getter und Setter verwendet, um Spielerstatistiken mit Validierung und berechneten Werten zu verwalten.

Du wirst deinen Code in zwei Dateien organisieren:

  • player.dart: Definiere eine Player-Klasse, die die Spielleistung eines Spielers verfolgt. Deine Klasse sollte Folgendes haben:
    • Ein String name-Feld für den Namen des Spielers
    • Ein privates int _score-Feld, das bei 0 beginnt
    • Ein privates int _lives-Feld, das bei 3 beginnt
    • Einen Konstruktor, der den Namen des Spielers entgegennimmt
    • Einen Getter score, der den aktuellen Punktestand zurückgibt
    • Einen Setter score, der nur Werte von 0 oder größer akzeptiert (negative Werte ignorieren)
    • Einen Getter lives, der die aktuellen Leben zurückgibt
    • Einen Setter lives, der nur Werte zwischen 0 und 5 inklusive akzeptiert (Werte außerhalb dieses Bereichs ignorieren)
    • Einen Getter level, der das Level des Spielers basierend auf dem Score berechnet: Score geteilt durch 100 (Ganzzahldivision), plus 1
    • Einen Getter isAlive, der true zurückgibt, wenn die Anzahl der Leben größer als 0 ist
    • Eine displayStatus()-Methode, die den aktuellen Status des Spielers ausgibt
  • main.dart: Importiere deine Player-Klasse und demonstriere die Getter und Setter:
    • Erstelle einen Spieler namens 'Alex'
    • Setze den Score auf 250 und rufe displayStatus() auf
    • Versuche, den Score auf -50 zu setzen (sollte ignoriert werden) und rufe displayStatus() auf
    • Setze die Leben auf 1 und rufe displayStatus() auf
    • Versuche, die Leben auf 10 zu setzen (sollte ignoriert werden) und rufe displayStatus() auf

Die displayStatus()-Methode sollte in genau diesem Format drucken:

[name] | Score: [score] | Level: [level] | Lives: [lives] | Alive: [isAlive]

Erwartete Ausgabe:

Alex | Score: 250 | Level: 3 | Lives: 3 | Alive: true
Alex | Score: 250 | Level: 3 | Lives: 3 | Alive: true
Alex | Score: 250 | Level: 3 | Lives: 1 | Alive: true
Alex | Score: 250 | Level: 3 | Lives: 1 | Alive: true

Spickzettel

Getter und Setter ermöglichen den kontrollierten Zugriff auf Klassenfelder durch spezielle Methoden, die wie reguläre Eigenschaften aussehen.

Getter – definiert mit dem Schlüsselwort get, gibt einen berechneten oder gespeicherten Wert zurück:

class Rectangle {
  double width;
  double height;
  
  Rectangle(this.width, this.height);
  
  double get area => width * height;
  double get perimeter => 2 * (width + height);
}

Rectangle rect = Rectangle(5, 3);
print(rect.area);      // 15.0 - Zugriff wie auf ein Feld, keine Klammern
print(rect.perimeter); // 16.0

Setter – verwendet das Schlüsselwort set und steuert, wie Werte zugewiesen werden:

class Temperature {
  double _celsius;
  
  Temperature(this._celsius);
  
  double get celsius => _celsius;
  set celsius(double value) {
    if (value >= -273.15) {
      _celsius = value;
    }
  }
  
  double get fahrenheit => _celsius * 9 / 5 + 32;
  set fahrenheit(double value) {
    celsius = (value - 32) * 5 / 9;
  }
}

Temperature temp = Temperature(25);
print(temp.fahrenheit);  // 77.0
temp.fahrenheit = 100;
print(temp.celsius);     // 37.78

Setter können Eingaben validieren und zwischen Einheiten umrechnen, während sie eine saubere, eigenschaftsähnliche Syntax beibehalten.

Probier es selbst

import 'player.dart';

void main() {
  // TODO: Erstelle einen Spieler namens 'Alex'

  // TODO: Setze den score auf 250 und rufe displayStatus() auf

  // TODO: Versuche, den score auf -50 zu setzen (sollte ignoriert werden) und rufe displayStatus() auf

  // TODO: Setze lives auf 1 und rufe displayStatus() auf

  // TODO: Versuche, lives auf 10 zu setzen (sollte ignoriert werden) und rufe displayStatus() auf
}
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