Menu
Coddy logo textTech

Accesseurs et mutateurs

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 des scores pour un jeu qui utilise des accesseurs et des mutateurs afin de gérer les statistiques du joueur avec validation et des valeurs calculées.

Tu organiseras ton code en deux fichiers :

  • player.dart : définir une classe Player qui suit les performances du joueur dans le jeu. Ta classe doit avoir :
    • Un champ String name pour le nom du joueur
    • Un champ privé int _score initialisé à 0
    • Un champ privé int _lives initialisé à 3
    • Un constructeur qui prend le nom du joueur
    • Un accesseur score qui renvoie le score actuel
    • Un mutateur score qui n'accepte que les valeurs supérieures ou égales à 0 (ignorer les valeurs négatives)
    • Un accesseur lives qui renvoie le nombre de vies actuel
    • Un mutateur lives qui n'accepte que les valeurs comprises entre 0 et 5 inclus (ignorer les valeurs situées en dehors de cette plage)
    • Un accesseur level qui calcule le niveau du joueur en fonction du score : le score divisé par 100 (division entière), plus 1
    • Un accesseur isAlive qui renvoie true si le nombre de vies est supérieur à 0
    • Une méthode displayStatus() qui affiche l'état actuel du joueur
  • main.dart : importer ta classe de joueur et montrer le fonctionnement des accesseurs et des mutateurs :
    • Créer un joueur nommé 'Alex'
    • Définir le score sur 250 et appeler displayStatus()
    • Essayer de définir le score sur -50 (devrait être ignoré) et appeler displayStatus()
    • Définir le nombre de vies sur 1 et appeler displayStatus()
    • Essayer de définir le nombre de vies sur 10 (devrait être ignoré) et appeler displayStatus()

La méthode displayStatus() doit afficher exactement au format suivant :

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

Résultat attendu :

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

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

Entraînez-vous par vous-même : Compilateur Dart en ligne