Home
Accesso / Registrazione
 di 

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

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.

 

 

Scrivi un commento all'articolo esprimendo la tua opinione sul tema, chiedendo eventuali spiegazioni e/o approfondimenti e contribuendo allo sviluppo dell'argomento proposto. Verranno accettati solo commenti a tema con l'argomento dell'articolo stesso. Commenti NON a tema dovranno essere necessariamente inseriti nel Forum creando un "nuovo argomento di discussione". Per commentare devi accedere al Blog

 

 

Login   
 Twitter Facebook LinkedIn Youtube Google RSS

Chi è online

Ci sono attualmente 1 utente e 36 visitatori collegati.

Utenti online

Ultimi Commenti