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.0Notez 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.78Le 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.
Défi
FacileConstruisons 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 classePlayerqui suit les performances de jeu d'un joueur. Votre classe doit avoir :- Un champ
String namepour le nom du joueur - Un champ privé
int _scorecommençant à0 - Un champ privé
int _livescommençant à3 - Un constructeur qui prend le nom du joueur
- Un getter
scorequi retourne le score actuel - Un setter
scorequi n'accepte que des valeurs de0ou plus (ignorez les valeurs négatives) - Un getter
livesqui retourne les vies actuelles - Un setter
livesqui n'accepte que des valeurs comprises entre0et5inclus (ignorez les valeurs en dehors de cette plage) - Un getter
levelqui calcule le niveau du joueur en fonction du score : score divisé par100(division entière), plus1 - Un getter
isAlivequi retournetruesi les vies sont supérieures à0 - Une méthode
displayStatus()qui affiche le statut actuel du joueur
- Un champ
main.dart: Importez votre classe player et démontrez les getters et setters :- Créez un joueur nommé
'Alex' - Définissez le score à
250et appelezdisplayStatus() - Essayez de définir le score à
-50(devrait être ignoré) et appelezdisplayStatus() - Définissez les vies à
1et appelezdisplayStatus() - Essayez de définir les vies à
10(devrait être ignoré) et appelezdisplayStatus()
- Créez un joueur nommé
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: trueAide-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.0Setter - 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.78Les 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()
}
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
1Les bases de la POO
Fichiers externesBibliothèques et importsIntroduction à la POOClasses vs ObjetsLe mot-clé thisMéthodesVariables d'instanceBases des constructeursRécapitulatif - Calculatrice simple4Null Safety
Introduction à la Null SafetyNullable vs Non-NullableLes opérateurs ? et !Le mot-clé late et la Null SafetyLes opérateurs Null-AwareLa Null Safety dans les classesRécapitulatif - Système de profil utilisateur7Classes abstraites et Interfaces
Classes abstraitesMéthodes abstraitesInterfaces en DartInterfaces implicitesImplémentation vs ExtensionInterfaces multiplesRécapitulatif - Calculateur de formes10Collections et Génériques
Aperçu des List, Set et MapCollections Type-SafeClasses génériquesMéthodes génériquesContraintes de généricitéIterable & IteratorRécapitulatif - Stockage générique2Les constructeurs en Dart
Constructeur par défautConstructeurs nommésListes d'initialisationConstructeurs constantsConstructeurs factoryConstructeurs de redirectionRécapitulatif - Shape Builder5Encapsulation
Membres publics vs privésLa convention du préfixe _Visibilité au niveau de la bibliothèqueApprofondissement des Getters & SettersMasquage d'informationsRécapitulatif - Dossiers d'étudiants8Mixins
Introduction aux MixinsCréation de MixinsUtilisation de plusieurs MixinsLe mot-clé on dans les MixinsMixin vs HéritageMixin vs InterfaceRécapitulatif - Système Animal11Méthodes spéciales
Redéfinition de toString()Redéfinition de hashCode & ==Interface ComparableMéthode call()Redéfinition de noSuchMethodRécapitulatif - Collection personnalisée14Patrons de conception Partie 1
Introduction aux patrons de conceptionPatron SingletonPatron FabriquePatron ObservateurPatron Stratégie3Propriétés de classe
Membres d'instance vs statiquesChamps Final & ConstVariables LateMéthodes et champs statiquesGetters et SettersRécapitulatif - Gestionnaire de compte bancaire6Héritage
Bases de l'héritageLe mot-clé superRedéfinition de méthodeL'annotation @overrideLe mot-clé final pour les classesConstructeurs et héritageRécapitulatif - Hiérarchie des employés9Polymorphisme
Bases du polymorphismePolymorphisme via les interfacesVérification de type à l'exécutionLes opérateurs is & asMot-clé covariantRécapitulatif - Processeur de paiement12POO Asynchrone
Futures & async/awaitBases des StreamsStream ControllersConstructeurs asynchronesL'asynchrone dans les méthodes de classeRécapitulatif - Data Fetcher15Patrons de conception Partie 2
Patron CommandePatron AdaptateurPatron DécorateurPatron Méthode ModèlePatron ÉtatPatron CompositePatron Repository