Utilisation polymorphe
Fait partie de la section Object Oriented Programming du Journey C de Coddy — leçon 47 sur 61.
Défi
FacileProuvons 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 baseShapeavec les typesDrawFuncetAreaFunc.circle.hetcircle.c: Votre implémentation de Circle de la leçon précédente.rectangle.hetrectangle.c: Votre implémentation de Rectangle de la leçon précédente.shape.c: Implémentez une nouvelle fonction appeléeprocess_shapequi prend un pointeurShape*. Cette fonction doit appeler la fonctiondrawde la forme, puis appeler sa fonctionareaet afficher le résultat avec 2 décimales au formatArea: X.XX.main.c: Démontrez le polymorphisme en action. Lisez un indicateur de type de forme (cpour circle,rpour rectangle) suivi des dimensions nécessaires. Créez la forme appropriée, puis passez un pointeur vers son membreShapeincorporé àprocess_shape. La même fonction gère les deux types !
Votre programme recevra soit :
csuivi d'une valeur de rayon, oursuivi 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.54Exemple 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.00La 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
1Bases de la programmation modulaire
Fichiers d'en-têteGardes d'inclusionFichiers sourcesFonctions statiquesRécapitulatif : Calculatrice modulaire4Encapsulation
Concept des pointeurs opaquesDéfinir des structures opaquesGetters et settersValidation dans les settersRécapitulatif : La boîte secrète2Objets et méthodes
Structs comme objetsLe pointeur 'Self'Rigueur du mot-clé constPointeur vs ValeurMéthodes utilitairesRécapitulatif : Point Manager5Projet : Compte bancaire simple
Configuration du projetImplémentation du compte8Polymorphisme
Pointeurs de fonctions dans les structuresSimulation de méthodesLe concept d'interfaceImplémentation d'interfacesItération polymorphiqueRécapitulatif : Greeter11Patrons de conception en C
Patron SingletonPatron FabriquePatron ItérateurRécapitulatif : Logger Factory3Cycle de vie des objets
Pattern de constructeurPattern de destructeurInitialisation sur la pileCopie profondeRécapitulatif : String Wrapper6Héritage par composition
Imbrication de structLa règle du premier membreAccès aux membres parentsUpcastingRécapitulatif : Hiérarchie des formes9Projet : Dessinateur de formes
Aperçu du projetImplémentation du cercle