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.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 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 classePlayerqui suit les performances du joueur dans le jeu. Ta classe doit avoir :- Un champ
String namepour le nom du joueur - Un champ privé
int _scoreinitialisé à0 - Un champ privé
int _livesinitialisé à3 - Un constructeur qui prend le nom du joueur
- Un accesseur
scorequi renvoie le score actuel - Un mutateur
scorequi n'accepte que les valeurs supérieures ou égales à0(ignorer les valeurs négatives) - Un accesseur
livesqui renvoie le nombre de vies actuel - Un mutateur
livesqui n'accepte que les valeurs comprises entre0et5inclus (ignorer les valeurs situées en dehors de cette plage) - Un accesseur
levelqui calcule le niveau du joueur en fonction du score : le score divisé par100(division entière), plus1 - Un accesseur
isAlivequi renvoietruesi le nombre de vies est supérieur à0 - Une méthode
displayStatus()qui affiche l'état actuel du joueur
- Un champ
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
250et appelerdisplayStatus() - Essayer de définir le score sur
-50(devrait être ignoré) et appelerdisplayStatus() - Définir le nombre de vies sur
1et appelerdisplayStatus() - Essayer de définir le nombre de vies sur
10(devrait être ignoré) et appelerdisplayStatus()
- Créer un joueur nommé
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: trueEssayez 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
1Fondamentaux de la POO
Fichiers externesBibliothèques et importsIntroduction à la POOClasses vs objetsLe mot-clé thisMéthodesVariables d’instanceBases des constructeursRécapitulatif - Calculatrice simple4Sécurité face aux valeurs nulles
Introduction à la sécurité face aux valeurs nullesNullable vs Non-NullableLes opérateurs ? et !Mot-clé Late et sécurité face aux valeurs nullesOpérateurs sensibles à nullSécurité face aux valeurs nulles dans les classesRécapitulatif – Système de profil utilisateur7Classes abstraites et interfaces
Classes abstraitesMéthodes abstraitesInterfaces en DartInterfaces implicitesImplémenter ou étendreInterfaces multiplesRécapitulatif - Calculateur de formes10Collections et génériques
Vue d’ensemble des List, Set et MapCollections à typage sûrClasses génériquesMéthodes génériquesContraintes génériquesIterable et IteratorRécapitulatif – stockage générique2Constructeurs en Dart
Constructeur par défautConstructeurs nommésListes d'initialisationConstructeurs constantsConstructeurs factoryConstructeurs redirigésRécapitulatif - Constructeur de formes5Encapsulation
Membres publics vs privésLa convention du préfixe _Confidentialité au niveau de la bibliothèqueApprofondissement des getters et settersMasquage de l’informationRécapitulatif - Fiches des étudiants8Mixins
Introduction aux MixinsCréer des MixinsUtiliser plusieurs MixinsMot-clé on dans les MixinsMixin ou héritageMixin ou interfaceRécapitulatif - Système animal11Méthodes spéciales
Redéfinition de toString()Redéfinition de hashCode et ==Interface ComparableMéthode call()Redéfinition de noSuchMethodRécapitulatif - Collection personnalisée14Patrons de conception, partie 1
Introduction aux patrons de conceptionPatron SingletonPatron FactoryPatron ObserverPatron Strategy3Propriétés des classes
Membres d’instance et statiquesChamps Final et ConstVariables différéesMéthodes et champs statiquesAccesseurs et mutateursRécapitulatif - Gestionnaire de compte bancaire6Héritage
Héritage de baseLe mot-clé superRedéfinition de méthodeL’annotation @overrideLe mot-clé de classe finalConstructeurs et héritageRécapitulatif – Hiérarchie des employés9Polymorphisme
Bases du polymorphismePolymorphisme via les interfacesVérification des types à l’exécutionLes opérateurs is et asMot-clé covariantRécapitulatif - Processeur de paiements12POO asynchrone
Futures et async/awaitNotions de base des StreamsContrôleurs de StreamsConstructeurs asynchronesAsynchrone dans les méthodes de classeRécapitulatif - récupérateur de données15Patrons de conception – Partie 2
Patron CommandePatron AdaptateurPatron DécorateurPatron Méthode modèlePatron ÉtatPatron CompositePatron DépôtEntraînez-vous par vous-même : Compilateur Dart en ligne