Menu
Coddy logo textTech

Classes abstraites

Fait partie de la section Programmation Orientée Objet du Journey Dart de Coddy — leçon 43 sur 110.

Une classe abstraite est une classe qui ne peut pas être instanciée directement. Elle sert de modèle pour d'autres classes, définissant une structure commune que les sous-classes doivent suivre. Vous en créez une en utilisant le mot-clé abstract.

abstract class Shape {
  String color;
  
  Shape(this.color);
  
  void describe() {
    print('A $color shape');
  }
}

class Circle extends Shape {
  double radius;
  
  Circle(String color, this.radius) : super(color);
}

void main() {
  // Shape s = Shape('red');  // Erreur ! Impossible d'instancier une classe abstraite
  var circle = Circle('blue', 5.0);
  circle.describe();  // Une forme bleue
}

Les classes abstraites sont utiles lorsque vous avez un concept trop général pour exister par lui-même. Une « Forme » est une idée, mais vous ne pouvez pas dessiner une forme sans savoir s'il s'agit d'un cercle, d'un rectangle ou d'un triangle. La classe abstraite définit ce que toutes les formes ont en commun, tandis que les sous-classes concrètes fournissent les détails spécifiques.

Notez que les classes abstraites peuvent toujours avoir des méthodes régulières avec des implémentations (comme describe()) et des constructeurs. Les sous-classes en héritent tout comme avec l'héritage normal. La différence clé est simplement que vous ne pouvez pas créer d'instance de la classe abstraite elle-même - vous devez utiliser une sous-classe concrète.

challenge icon

Défi

Facile

Construisons un système de véhicules qui démontre comment les classes abstraites servent de modèles pour des types plus spécifiques. Vous allez créer une classe de base abstraite qui définit ce que tous les véhicules ont en commun, puis l'étendre avec des types de véhicules concrets.

Vous organiserez votre code en deux fichiers :

  • vehicle.dart : Définissez votre hiérarchie de véhicules ici :
    • Une abstract class Vehicle avec une propriété String brand et int year. Incluez un constructeur qui prend les deux valeurs et une méthode displayInfo() qui affiche [brand] ([year])
    • Une classe Car qui étend Vehicle et ajoute une propriété int doors. Incluez une méthode honk() qui affiche Beep beep!
    • Une classe Motorcycle qui étend Vehicle et ajoute une propriété bool hasSidecar. Incluez une méthode revEngine() qui affiche Vroom!
  • main.dart : Importez votre fichier de véhicule et démontrez le fonctionnement des classes abstraites :
    • Créez une Car avec la marque 'Toyota', l'année 2022, et le nombre de portes 4
    • Appelez sa méthode displayInfo() (héritée de Vehicle)
    • Affichez Doors: [doors]
    • Appelez sa méthode honk()
    • Affichez une ligne vide
    • Créez une Motorcycle avec la marque 'Harley', l'année 2021, et hasSidecar false
    • Appelez sa méthode displayInfo()
    • Affichez Has sidecar: [hasSidecar]
    • Appelez sa méthode revEngine()

Rappelez-vous que vous ne pouvez pas créer une instance de Vehicle directement puisqu'elle est abstraite - vous devez utiliser l'une des sous-classes concrètes. Car et Motorcycle héritent toutes deux de la méthode displayInfo() de la classe parente abstraite.

Sortie attendue :

Toyota (2022)
Doors: 4
Beep beep!

Harley (2021)
Has sidecar: false
Vroom!

Aide-mémoire

Une classe abstraite est une classe qui ne peut pas être instanciée directement. Elle sert de modèle pour d'autres classes, définissant une structure commune que les sous-classes doivent suivre. Créez-en une en utilisant le mot-clé abstract :

abstract class Shape {
  String color;
  
  Shape(this.color);
  
  void describe() {
    print('A $color shape');
  }
}

class Circle extends Shape {
  double radius;
  
  Circle(String color, this.radius) : super(color);
}

void main() {
  // Shape s = Shape('red');  // Erreur ! Impossible d'instancier une classe abstraite
  var circle = Circle('blue', 5.0);
  circle.describe();  // A blue shape
}

Les classes abstraites peuvent avoir :

  • Des méthodes régulières avec des implémentations
  • Des constructeurs
  • Des propriétés

Les sous-classes héritent de ces membres tout comme avec l'héritage normal. La différence clé est que vous ne pouvez pas créer une instance de la classe abstraite elle-même - vous devez utiliser une sous-classe concrète.

Essayez vous-même

import 'vehicle.dart';

void main() {
  // TODO: Créer une Car avec la marque 'Toyota', l'année 2022, et 4 portes
  
  // TODO: Appeler displayInfo() sur la voiture
  
  // TODO: Afficher "Doors: [doors]"
  
  // TODO: Appeler honk() sur la voiture
  
  // TODO: Afficher une ligne vide
  
  // TODO: Créer une Motorcycle avec la marque 'Harley', l'année 2021, et hasSidecar false
  
  // TODO: Appeler displayInfo() sur la moto
  
  // TODO: Afficher "Has sidecar: [hasSidecar]"
  
  // TODO: Appeler revEngine() sur la moto
}
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