Menu
Coddy logo textTech

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);  // 2

La 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.

challenge icon

Défi

Facile

Construisons 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 classe Exhibit qui 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 à 0 pour suivre le nombre de personnes ayant visité cette exposition spécifique
    • Une variable statique totalVisitors (int) commençant à 0 pour 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 le visitorCount de l'exposition et le totalVisitors de la classe
    • Une méthode displayStats() qui affiche les informations de l'exposition
  • main.dart : Importez votre classe d'exposition et créez deux expositions :
    • Une exposition 'Dinosaur Bones'
    • Une exposition 'Ancient Egypt'
    Enregistrez 3 visites pour l'exposition Dinosaur Bones, puis enregistrez 2 visites pour l'exposition Ancient Egypt. Après toutes les visites, appelez displayStats() sur chaque exposition dans l'ordre où elles ont été créées, puis affichez le nombre total de visiteurs pour toutes les expositions.

La méthode displayStats() doit afficher les informations dans ce format exact :

[name]: [visitorCount] visitors

Pour 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: 5

Aide-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);  // 2

Les 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]
}
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