Menu
Coddy logo textTech

Utilisation polymorphe

Fait partie de la section Object Oriented Programming du Journey C de Coddy — leçon 47 sur 61.

challenge icon

Défi

Facile

Prouvons 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 Rectangle, vous allez ajouter une abstraction puissante : une fonction unique qui travaille uniformément avec n'importe quel type de forme.

Votre projet comprendra ces fichiers :

  • 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 prend 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 circle, r pour rectangle) suivi des dimensions nécessaires. Créez la forme appropriée, puis passez un pointeur vers son membre Shape incorporé à process_shape. La même fonction gère les deux types !

Votre programme recevra soit :

  • c suivi d'une valeur de rayon, ou
  • r suivi des 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 n'a aucune idée s'il travaille avec un Circle ou un Rectangle — il ne connaît que l'interface Shape. En castant le membre Shape incorporé de votre forme concrète en un Shape*, vous pouvez passer n'importe quel type de forme à cette fonction unique. C'est le polymorphisme : une fonction, plusieurs comportements basés sur le type réel de l'objet.

N'oubliez pas de déclarer process_shape dans shape.h afin qu'elle puisse être appelée 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 circle, '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 Object Oriented Programming