Riepilogo: gerarchia di forme
Fa parte della sezione Programmazione orientata agli oggetti del percorso C di Coddy. Lezione 32 di 61.
Sfida
FacileCostruiamo una gerarchia completa di forme che dimostri la potenza dell’ereditarietà tramite composizione. Creerai un tipo base Shape da cui può ereditare qualsiasi forma specifica, poi creerai un Rect che lo estende.
Organizzerai il codice in tre file:
shape.h: Definisci la gerarchia di struct con le guardie di inclusione. Crea una structShapecon un unico campocolor(un intero). Poi definisci una structRectche incorporaShapecome primo membro e aggiunge i campiwidtheheight(entrambi interi). Dichiara due funzioni:set_color, che accetta unShape*e un nuovo valore di colore, eprint_rect, che accetta unRect*.shape.c: Implementa entrambe le funzioni. La funzioneset_colorlavora con il tipo base. Modifica il colore di qualsiasi forma. La funzioneprint_rectvisualizza tutte le informazioni del rettangolo, compreso il colore ereditato.main.c: Crea unRecte inizializza tutti i suoi campi. Poi mostra l’upcasting chiamandoset_colorcon il tuo rettangolo convertito inShape*. Infine, stampa il rettangolo per verificare che il colore sia stato modificato tramite il puntatore al tipo base.
Riceverai quattro valori in input: la larghezza del rettangolo, la sua altezza, un colore iniziale e un nuovo colore da impostare tramite la funzione generica.
Nel file principale, crea il rettangolo con i valori iniziali, poi usa set_color per cambiarne il colore impostandolo al nuovo valore (ricordati di convertire il tuo Rect* in Shape*) e infine chiama print_rect per visualizzare il risultato.
L’output dovrebbe essere simile a questo:
Width: 10
Height: 5
Color: 7Dove 10 è la larghezza, 5 è l’altezza e 7 è il colore aggiornato (non quello iniziale). L’intuizione fondamentale è che set_color non sa nulla dei rettangoli. Lavora solo con Shape. Tuttavia, grazie alla regola del primo membro e all’upcasting, il colore del tuo rettangolo viene modificato tramite questa funzione generica.
Provalo tu
#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: Crea un Rect e inizializza tutti i suoi campi
// (width, height e il colore dello Shape incorporato con initial_color)
// TODO: Chiama set_color passando il rettangolo convertito in Shape*
// per cambiare il colore in new_color
// TODO: Chiama print_rect per visualizzare il risultato
return 0;
}
Tutte le lezioni di Programmazione orientata agli oggetti
1Basi di programmazione modulare
File di intestazioneGuardie di inclusioneFile sorgenteFunzioni staticheRipasso: calcolatrice modulare4Incapsulamento
Il concetto di puntatori opachiDefinire struct opacheGetter e setterLa convalida nei setterRiepilogo: scatola segreta2Oggetti e metodi
Le struct come oggettiIl puntatore 'Self'Correttezza constPuntatore o valoreMetodi di supportoRiepilogo: gestore di punti5Progetto: Conto bancario semplice
Configurazione del progettoImplementazione del conto8Polimorfismo
Puntatori a funzione nelle structSimulare i metodiIl concetto di interfacciaImplementare le interfacceIterazione polimorficaRiepilogo: Greeter11Pattern di progettazione in C
Pattern SingletonPattern FactoryPattern IteratorRiepilogo: Factory di Logger3Ciclo di vita degli oggetti
Pattern del costruttorePattern del distruttoreInizializzazione sullo stackCopia profondaRiepilogo: wrapper di stringhe6Ereditarietà tramite composizione
Incorporamento delle structLa regola del primo membroAccesso ai membri della classe baseUpcastingRiepilogo: gerarchia di forme9Progetto: Disegnatore di forme
Panoramica del progettoImplementazione del cerchioImplementazione del rettangoloUtilizzo polimorficoContenitore di formeEsercitati da solo: Compilatore C online