Récapitulatif : Hiérarchie des formes
Fait partie de la section Object Oriented Programming du Journey C de Coddy — leçon 32 sur 61.
Défi
FacileConstruisons une hiérarchie de formes complète qui démontre la puissance de l'héritage via la composition. Vous allez créer un type de base Shape dont n'importe quelle forme spécifique peut hériter, puis construire 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 imbriqueShapecomme premier membre et ajoute les champswidthetheight(tous deux des entiers). Déclarez deux fonctions :set_colorqui prend unShape*et une nouvelle valeur de couleur, etprint_rectqui prend unRect*.shape.c: Implémentez les deux fonctions. Votre fonctionset_colortravaille avec le type de base — elle modifie la couleur de n'importe quelle 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 le transtypage ascendant (upcasting) en appelantset_coloravec votre rectangle converti enShape*. Enfin, affichez le rectangle pour vérifier que la couleur a été modifiée via le pointeur du type de base.
Vous recevrez quatre entrées : la largeur (width) du rectangle, sa hauteur (height), une couleur initiale (initial color), et une nouvelle couleur (new color) à 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 changer sa couleur par la nouvelle valeur (n'oubliez pas de transtyper votre Rect* en Shape*), et enfin appelez 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 (pas la couleur initiale). L'idée clé ici est que set_color ne connaît rien aux rectangles — elle ne travaille qu'avec Shape. Pourtant, grâce à la règle du premier membre et au transtypage, la couleur de votre rectangle est modifiée via 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 de la Shape intégrée 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 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