Utilizzo polimorfico
Fa parte della sezione Programmazione orientata agli oggetti del percorso C di Coddy. Lezione 47 di 61.
Sfida
FacileDimostriamo che il polimorfismo funziona davvero scrivendo una funzione in grado di elaborare qualsiasi forma tramite il puntatore di base Shape*, che si tratti di un Circle o di un Rectangle.
Partendo dalle implementazioni di Circle e Rectangle che hai già realizzato, aggiungerai una potente astrazione: un'unica funzione che gestisce in modo uniforme qualsiasi tipo di forma.
Il tuo progetto includerà questi file:
shape.h: l'interfaccia di baseShapecon i tipiDrawFunceAreaFunc.circle.hecircle.c: l'implementazione di Circle della lezione precedente.rectangle.herectangle.c: l'implementazione di Rectangle della lezione precedente.shape.c: implementa una nuova funzione chiamataprocess_shapeche accetta un puntatoreShape*. Questa funzione deve chiamare la funzionedrawdella forma, quindi chiamare la sua funzioneareae stampare il risultato con 2 cifre decimali nel formatoArea: X.XX.main.c: mostra il polimorfismo in azione. Leggi un indicatore del tipo di forma (cper Circle,rper Rectangle) seguito dalle dimensioni necessarie. Crea la forma appropriata, quindi passa aprocess_shapeun puntatore al suo membroShapeincorporato. La stessa funzione gestisce entrambi i tipi!
Il tuo programma riceverà uno dei seguenti input:
cseguito dal valore del raggio, oppurerseguito dai valori di larghezza e altezza
Output di esempio quando gli input sono c e 5.0:
Drawing Circle with radius: 5.00
Area: 78.54Output di esempio quando gli input sono r, 4.0 e 3.0:
Drawing Rectangle with width: 4.00 and height: 3.00
Area: 12.00La particolarità è che process_shape non sa se sta lavorando con un Circle o un Rectangle. Conosce solo l'interfaccia Shape. Convertendo il membro Shape incorporato della forma concreta in un Shape*, puoi passare qualsiasi tipo di forma a quest'unica funzione. Questo è il polimorfismo: una funzione, comportamenti diversi in base al tipo effettivo dell'oggetto.
Ricorda di dichiarare process_shape in shape.h, così potrà essere chiamata da main.c.
Provalo tu
#include <stdio.h>
#include "shape.h"
#include "circle.h"
#include "rectangle.h"
int main() {
// TODO: Leggi un char per il tipo di forma ('c' per cerchio, 'r' per rettangolo)
// TODO: Se il valore è 'c', leggi il raggio, crea un Circle e chiama process_shape con la sua base
// TODO: Se il valore è 'r', leggi la larghezza e l'altezza, crea un Rectangle e chiama process_shape con la sua base
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