Récapitulatif : Hiérarchie des formes
Fait partie de la section Programmation Orientée Objet du Journey C de Coddy. Leçon 32 sur 61.
Défi
FacileConstruisons une hiérarchie complète de formes qui démontre la puissance de l’héritage par composition. Vous allez créer un type de base Shape dont toute forme spécifique pourra hériter, puis créer un Rect qui l’étend.
Vous organiserez votre code sur trois fichiers :
shape.h: définissez votre hiérarchie de structures avec des gardes d’inclusion. Créez une structureShapeavec un seul champcolor(un entier). Définissez ensuite une structureRectqui intègreShapecomme premier membre et ajoute les champswidthetheight(tous deux des entiers). Déclarez deux fonctions :set_color, qui prend unShape*et une nouvelle valeur de couleur, etprint_rect, qui prend unRect*.shape.c: implémentez les deux fonctions. Votre fonctionset_colorfonctionne avec le type de base. Elle modifie la couleur de toute forme. Votre fonctionprint_rectaffiche toutes les informations du rectangle, y compris sa couleur héritée.main.c: créez unRectet initialisez tous ses champs. Démontrez ensuite la conversion ascendante en appelantset_coloravec votre rectangle converti enShape*. Enfin, affichez le rectangle pour vérifier que la couleur a été modifiée via le pointeur vers le type de base.
Vous recevrez quatre entrées : la largeur du rectangle, sa hauteur, une couleur initiale et une nouvelle couleur à définir via la fonction générique.
Dans votre fichier principal, créez le rectangle avec les valeurs initiales, puis utilisez set_color pour modifier sa couleur et lui attribuer la nouvelle valeur (n’oubliez pas de convertir votre Rect* en Shape*), et appelez enfin print_rect pour afficher le résultat.
Votre sortie devrait ressembler à ceci :
Width: 10
Height: 5
Color: 7Où 10 est la largeur, 5 est la hauteur et 7 est la couleur mise à jour (et non la couleur initiale). L’idée essentielle est que set_color ne sait rien des rectangles. Elle fonctionne uniquement avec Shape. Pourtant, grâce à la règle du premier membre et à la conversion ascendante, la couleur de votre rectangle est modifiée par l’intermédiaire de cette fonction générique.
Essayez vous-même
#include <stdio.h>
#include "shape.h"
int main() {
int width, height, initial_color, new_color;
scanf("%d", &width);
scanf("%d", &height);
scanf("%d", &initial_color);
scanf("%d", &new_color);
// TODO: Créer un Rect et initialiser tous ses champs
// (width, height, et la couleur du Shape embarqué avec initial_color)
// TODO: Appeler set_color avec le rectangle casté en Shape*
// pour changer la couleur en new_color
// TODO: Appeler print_rect pour afficher le résultat
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