Programmazione orientata agli oggetti in ANSI-C. E’ o ha? – Ereditarietà ed aggregazione

La nostra rappresentazione di un cerchio contiene la rappresentazione di un punto come primo componente della struct Circle

struct Circle { const struct Point _; int rad; };

D'altro canto, abbiamo volontariamente deciso di non accedere a questo componente direttamente. Quando vogliamo ereditare, effettueremo il cast-up da Circle a Point e pertanto avremmo poi a che fare con la struct Point iniziale.

C'è anche un altro metodo per rappresentare un cerchio: può contenere un punto come un aggregato. Possiamo gestire gli oggetti solo attraverso puntatori: di conseguenza questa rappresentazione du un cerchio potrebbe apparire come:

Questo cerchio non è più come un punto, ossia non può ereditare da Point e riutilizzare i suoi metodi. Può, però, applicare i metodi del Punto ai suoi componenti punto, essenzialmente non può applicare i metodi del Punto a sè stesso.

Se un linguaggio avesse una sintassi esplicita per l'ereditarietà, la distinzione diventerebbe meno sottile. Simili rappresentazioni potrebbero assomigliare in C++ alle seguenti:

struct Circle : Point { int rad; }; // inheritance
struct Circle2 {
struct Point point; int rad; // aggregate
};

In C++ non avremo necessariamente accesso agli oggetti solo attraverso i puntatori.

L'ereditarietà, ossia creare una sottoclasse da una superclasse e l'aggregazione, ossia includere un oggetto come componente di qualche altro oggetto, costituiscono funzionalità molto simili. Quale approccio utilizzare in un caso specifico di progettazione? Si tratta di rispondere alla domanda: un oggetto è qualcosa oppure è fatto di qualcosa? Se un oggetto di una nuova classe è proprio come un oggetto di qualche altra classe dovremmo sfruttare l'ereditarietà. Se un oggetto di una nuova classe ha un oggetto di una qualche altra classe come parte del suo stato, dovrebbo seguire la strada dell'aggregazione.

Per quanto concerne i nostri oggetti punto, un cerchio può essere visto come un grosso punto ed ecco il motivo per cui abbiamo usato l'ereditarietà per la classe Circle. Un rettangolo è un esempio ambiguo: possiamo descriverso attraverso un punto di riferimento e la lunghezza dei sui lati, oppure possiamo usare i punti estremi di una diagonale o addirittura i 3 angoli. Solo con un punto di riferimento si può considerare il rettangolo come una sorta di punto, con l'altra rappresentazione è più semplice parlare di aggregazione.

Scarica subito una copia gratis

Scrivi un commento

Seguici anche sul tuo Social Network preferito!

Send this to a friend