Menu
Coddy logo textTech

Utilisation polymorphe

Fait partie de la section Programmation Orientée Objet du Journey C de Coddy. Leçon 47 sur 61.

challenge icon

Défi

Facile

Vérifions que le polymorphisme fonctionne réellement en écrivant une fonction capable de traiter n'importe quelle forme via le pointeur de base Shape*, qu'il s'agisse d'un Circle ou d'un Rectangle.

En vous appuyant sur vos implémentations existantes de Circle et de Rectangle, vous allez ajouter une abstraction puissante : une seule fonction qui fonctionne uniformément avec n'importe quel type de forme.

Votre projet comprendra les fichiers suivants :

  • shape.h : votre interface de base Shape avec les types DrawFunc et AreaFunc.
  • circle.h et circle.c : votre implémentation de Circle de la leçon précédente.
  • rectangle.h et rectangle.c : votre implémentation de Rectangle de la leçon précédente.
  • shape.c : implémentez une nouvelle fonction appelée process_shape qui reçoit un pointeur Shape*. Cette fonction doit appeler la fonction draw de la forme, puis appeler sa fonction area et afficher le résultat avec 2 décimales au format Area: X.XX.
  • main.c : démontrez le polymorphisme en action. Lisez un indicateur de type de forme (c pour un cercle, r pour un rectangle), suivi des dimensions nécessaires. Créez la forme appropriée, puis transmettez un pointeur vers son membre Shape intégré à process_shape. La même fonction gère les deux types !

Votre programme recevra l'une des entrées suivantes :

  • c suivi d'une valeur de rayon, ou
  • r suivi de valeurs de largeur et de hauteur

Exemple de sortie lorsque les entrées sont c et 5.0 :

Drawing Circle with radius: 5.00
Area: 78.54

Exemple de sortie lorsque les entrées sont r, 4.0 et 3.0 :

Drawing Rectangle with width: 4.00 and height: 3.00
Area: 12.00

La magie, ici, est que process_shape ne sait pas s'il travaille avec un Circle ou un Rectangle. Il ne connaît que l'interface Shape. En convertissant le membre Shape intégré de votre forme concrète en Shape*, vous pouvez transmettre n'importe quel type de forme à cette fonction unique. C'est cela, le polymorphisme : une fonction, plusieurs comportements selon le type réel de l'objet.

N'oubliez pas de déclarer process_shape dans shape.h afin de pouvoir l'appeler depuis main.c.

Essayez vous-même

#include <stdio.h>
#include "shape.h"
#include "circle.h"
#include "rectangle.h"

int main() {
    // TODO: Lire un char pour le type de forme ('c' pour cercle, 'r' pour rectangle)
    // TODO: Si 'c', lire le rayon, créer un Circle, et appeler process_shape avec sa base
    // TODO: Si 'r', lire la largeur et la hauteur, créer un Rectangle, et appeler process_shape avec sa base
    return 0;
}

Toutes les leçons de Programmation Orientée Objet

Entraînez-vous par vous-même : Compilateur C en ligne