Menu
Coddy logo textTech

Utilizzo polimorfico

Fa parte della sezione Programmazione orientata agli oggetti del percorso C di Coddy. Lezione 47 di 61.

challenge icon

Sfida

Facile

Dimostriamo 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 base Shape con i tipi DrawFunc e AreaFunc.
  • circle.h e circle.c: l'implementazione di Circle della lezione precedente.
  • rectangle.h e rectangle.c: l'implementazione di Rectangle della lezione precedente.
  • shape.c: implementa una nuova funzione chiamata process_shape che accetta un puntatore Shape*. Questa funzione deve chiamare la funzione draw della forma, quindi chiamare la sua funzione area e stampare il risultato con 2 cifre decimali nel formato Area: X.XX.
  • main.c: mostra il polimorfismo in azione. Leggi un indicatore del tipo di forma (c per Circle, r per Rectangle) seguito dalle dimensioni necessarie. Crea la forma appropriata, quindi passa a process_shape un puntatore al suo membro Shape incorporato. La stessa funzione gestisce entrambi i tipi!

Il tuo programma riceverà uno dei seguenti input:

  • c seguito dal valore del raggio, oppure
  • r seguito 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.54

Output di esempio quando gli input sono r, 4.0 e 3.0:

Drawing Rectangle with width: 4.00 and height: 3.00
Area: 12.00

La 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

Esercitati da solo: Compilatore C online