Membres d'instance vs statiques
Fait partie de la section Programmation Orientée Objet du Journey Dart de Coddy — leçon 17 sur 110.
Dans les classes Dart, les membres (variables et méthodes) peuvent appartenir soit à des objets individuels, soit à la classe elle-même. Comprendre cette distinction est fondamental pour organiser votre code efficacement.
Les membres d'instance appartiennent à chaque objet que vous créez. Chaque objet reçoit sa propre copie des variables d'instance, et les méthodes d'instance opèrent sur les données de cet objet spécifique :
class Dog {
String name; // Variable d'instance
Dog(this.name);
void bark() { // Méthode d'instance
print('$name says woof!');
}
}
Dog dog1 = Dog('Buddy');
Dog dog2 = Dog('Max');
dog1.bark(); // Buddy says woof!
dog2.bark(); // Max says woof!Chaque objet Dog a son propre name. Changer le nom d'un chien n'affecte pas l'autre.
Les membres statiques appartiennent à la classe elle-même, et non à un objet particulier. Ils sont partagés entre toutes les instances et on y accède en utilisant le nom de la classe :
class Dog {
String name;
static int totalDogs = 0; // Variable statique
Dog(this.name) {
totalDogs++;
}
}
Dog dog1 = Dog('Buddy');
Dog dog2 = Dog('Max');
print(Dog.totalDogs); // 2La variable totalDogs est partagée - il n'en existe qu'une seule copie, quel que soit le nombre d'objets Dog existants. Vous y accédez via le nom de la classe Dog.totalDogs, et non via une instance.
Défi
FacileConstruisons un système de comptage de visiteurs pour un musée qui suit à la fois les visites d'expositions individuelles et les statistiques globales du musée.
Vous organiserez votre code en deux fichiers :
exhibit.dart: Définissez une classeExhibitqui représente une exposition de musée. Chaque exposition doit avoir :- Une variable d'instance
name(String) pour le nom de l'exposition - Une variable d'instance
visitorCount(int) commençant à0pour suivre le nombre de personnes ayant visité cette exposition spécifique - Une variable statique
totalVisitors(int) commençant à0pour suivre le nombre total de visites dans toutes les expositions - Un constructeur qui prend le nom de l'exposition
- Une méthode
recordVisit()qui incrémente à la fois levisitorCountde l'exposition et letotalVisitorsde la classe - Une méthode
displayStats()qui affiche les informations de l'exposition
- Une variable d'instance
main.dart: Importez votre classe d'exposition et créez deux expositions :- Une exposition
'Dinosaur Bones' - Une exposition
'Ancient Egypt'
displayStats()sur chaque exposition dans l'ordre où elles ont été créées, puis affichez le nombre total de visiteurs pour toutes les expositions.- Une exposition
La méthode displayStats() doit afficher les informations dans ce format exact :
[name]: [visitorCount] visitorsPour la ligne du total des visiteurs, affichez :
Total museum visitors: [totalVisitors]Accédez à la variable statique en utilisant le nom de la classe Exhibit.totalVisitors.
Sortie attendue :
Dinosaur Bones: 3 visitors
Ancient Egypt: 2 visitors
Total museum visitors: 5Aide-mémoire
Les membres de classe en Dart peuvent être soit des membres d'instance (appartenant à des objets individuels), soit des membres statiques (appartenant à la classe elle-même).
Les membres d'instance sont uniques à chaque objet. Chaque objet possède sa propre copie des variables d'instance :
class Dog {
String name; // Variable d'instance
Dog(this.name);
void bark() { // Méthode d'instance
print('$name says woof!');
}
}Les membres statiques sont partagés entre toutes les instances et on y accède en utilisant le nom de la classe avec le mot-clé static :
class Dog {
String name;
static int totalDogs = 0; // Variable statique
Dog(this.name) {
totalDogs++;
}
}
// Accéder aux membres statiques via le nom de la classe
print(Dog.totalDogs); // 2Les variables statiques conservent une valeur partagée unique, quel que soit le nombre d'objets créés.
Essayez vous-même
import 'exhibit.dart';
void main() {
// TODO: Créer une exposition 'Dinosaur Bones'
// TODO: Créer une exposition 'Ancient Egypt'
// TODO: Enregistrer 3 visites pour l'exposition 'Dinosaur Bones'
// TODO: Enregistrer 2 visites pour l'exposition 'Ancient Egypt'
// TODO: Appeler displayStats() sur chaque exposition dans l'ordre
// TODO: Afficher le nombre total de visiteurs du musée en utilisant Exhibit.totalVisitors
// Format: Total museum visitors: [totalVisitors]
}
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