Menu
Coddy logo textTech

Getters et Setters

Fait partie de la section Programmation Orientée Objet du Journey Dart de Coddy — leçon 21 sur 110.

Les getters et les setters offrent un moyen d'accéder aux champs d'une classe et de les modifier via des méthodes spéciales qui ressemblent à des propriétés ordinaires. Au lieu d'exposer les champs directement, vous pouvez contrôler la manière dont les valeurs sont lues et écrites.

Un getter est défini à l'aide du mot-clé get et retourne une valeur calculée ou stockée :

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

Notez que area et perimeter sont accédés comme des champs, mais ils sont calculés à chaque fois. Aucune parenthèse n'est nécessaire.

Un setter utilise le mot-clé set et vous permet de contrôler la manière dont une valeur est assignée :

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

Le setter valide l'entrée avant de la stocker et peut même effectuer des conversions entre unités. Cela vous donne le contrôle sur vos données tout en conservant une syntaxe propre, semblable à celle d'une propriété, pour les utilisateurs de votre classe.

challenge icon

Défi

Facile

Construisons un suivi de score pour un jeu qui utilise des getters et des setters pour gérer les statistiques des joueurs avec validation et valeurs calculées.

Vous organiserez votre code en deux fichiers :

  • player.dart : Définissez une classe Player qui suit les performances de jeu d'un joueur. Votre classe doit avoir :
    • Un champ String name pour le nom du joueur
    • Un champ privé int _score commençant à 0
    • Un champ privé int _lives commençant à 3
    • Un constructeur qui prend le nom du joueur
    • Un getter score qui retourne le score actuel
    • Un setter score qui n'accepte que des valeurs de 0 ou plus (ignorez les valeurs négatives)
    • Un getter lives qui retourne les vies actuelles
    • Un setter lives qui n'accepte que des valeurs comprises entre 0 et 5 inclus (ignorez les valeurs en dehors de cette plage)
    • Un getter level qui calcule le niveau du joueur en fonction du score : score divisé par 100 (division entière), plus 1
    • Un getter isAlive qui retourne true si les vies sont supérieures à 0
    • Une méthode displayStatus() qui affiche le statut actuel du joueur
  • main.dart : Importez votre classe player et démontrez les getters et setters :
    • Créez un joueur nommé 'Alex'
    • Définissez le score à 250 et appelez displayStatus()
    • Essayez de définir le score à -50 (devrait être ignoré) et appelez displayStatus()
    • Définissez les vies à 1 et appelez displayStatus()
    • Essayez de définir les vies à 10 (devrait être ignoré) et appelez displayStatus()

La méthode displayStatus() doit imprimer exactement dans ce format :

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

Sortie attendue :

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

Aide-mémoire

Les getters et setters offrent un accès contrôlé aux champs d'une classe via des méthodes spéciales qui ressemblent à des propriétés classiques.

Getter - défini à l'aide du mot-clé get, il renvoie une valeur calculée ou stockée :

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 - accédé comme un champ, sans parenthèses
print(rect.perimeter); // 16.0

Setter - utilise le mot-clé set, il contrôle la manière dont les valeurs sont assignées :

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

Les setters peuvent valider les entrées et effectuer des conversions entre unités tout en conservant une syntaxe propre, semblable à celle des propriétés.

Essayez vous-même

import 'player.dart';

void main() {
  // TODO: Créer un joueur nommé 'Alex'

  // TODO: Définir le score à 250 et appeler displayStatus()

  // TODO: Essayer de définir le score à -50 (devrait être ignoré) et appeler displayStatus()

  // TODO: Définir lives à 1 et appeler displayStatus()

  // TODO: Essayer de définir lives à 10 (devrait être ignoré) et appeler displayStatus()
}
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Programmation Orientée Objet