Utilisation polymorphe
Fait partie de la section Programmation Orientée Objet du Journey C de Coddy. Leçon 47 sur 61.
Défi
FacileVé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 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 reçoit 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 un cercle,rpour un rectangle), suivi des dimensions nécessaires. Créez la forme appropriée, puis transmettez un pointeur vers son membreShapeintégré àprocess_shape. La même fonction gère les deux types !
Votre programme recevra l'une des entrées suivantes :
csuivi d'une valeur de rayon, oursuivi 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.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 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
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 cercleImplémentation du rectangleUtilisation polymorpheConteneur de formesEntraînez-vous par vous-même : Compilateur C en ligne