Programmazione orientata agli oggetti in ANSI-C. Manutenzione delle gerarchie di classe. Radici – Oggetti e Classi

Le descrizioni delle classi con gli stessi insiemi di metodi sono oggetti di una metaclasse. Una metaclasse è essa stessa una classe e di conseguenza ha una descrizione di classe. Dobbiamo ipotizzare che le descrizioni di classe per le metaclassi siano, ancora una volta, oggetti di meta classi (meta meta classi quindi), che a loro volta siano classi di... e così via.

Sembra poco saggio continuare questa linea di pensiero. Pensiamo quindi di iniziare con l'oggetto più semplice immaginabile. Definiamo una classe Object che abbia la capacità di crare, distruggere, confrontare e mostrare oggetti.

Interfaccia Object.h sarà:

extern const void * Object; /* new(Object); */
void * new (const void * class, ...);
void delete (void * self);
int differ (const void * self, const void * b);
int puto (const void * self, FILE * fp);

Il file rappresentazione Object.r:

struct Object {
const struct Class * class; /* object’s description */
};

Poi, definiamo la rappresentazione per la descrizione di classe degli oggetti, ossia la struttura alla quale il componente .class di struct Object punta. Entrambe le strutture devono essere presenti allo stesso tempo, così andiamo ad aggiungere ad Object.h

extern const void * Class; /* new(Class, "name", super, size
sel, meth, ... 0); */
e a Object.r 
struct Class {
const struct Object _; /* class’ description */
const char * name; /* class’ name */
const struct Class * super; /* class’ super class */
size_t size; /* class’ object’s size */
void * (* ctor) (void * self, va_list * app);
void * (* dtor) (void * self);
int (* differ) (const void * self, const void * b);
int (* puto) (const void * self, FILE * fp);
};

struct Class è la rappresentazione di ogni elemento della prima metaclasse Class. Questa metaclasse è essa stessa una classe, di conseguenza i suoi elementi puntano ad una descrizione di classe. Puntare ad una descrizione di classe è esattamente ciò che un Object può fare, ossia struct Class estende la struct Object, ossia Class è una sottoclasse di Object!

Il ragionamento di cui sopra fila liscio: gli oggetti – ossia le istanze della classe Object – possono essere creati, distrutti, confrontati fra loro e mostrati. Abbiamo deciso che vogliamo creare descrizioni di classe, e possiamo scrivere un distruttore che in maniera trasparente evita che una descrizione di classe venga eliminata. Può essere abbastanza utile essere in grado di confrontare e mostrare informazioni sulle descrizioni di classe. Tuttavia, ciò vale a dire che la metaclasse Class abbia lo stesso insieme di metodi – e di conseguenza la stessa descrizione di tipo – della classe Object. In altre parole, la catena dagli oggetti alla loro descrizione di classe e dalla descrizione di classe alla descrizione della descrizione di classe termina proprio qui. Con un'adeguata inizializzazione, possiamo delineare la seguente figura per visualizzare il concetto pocanzi introdotto.

I punti di domanda in figura indicano nient'altro che una decisione arbitraria: gli Object hanno una superclasse o no? Non fa alcuna differenza, ma per una maggiore uniformità di rappresentazione definiamo Object essere la superclasse di sè stessa, quindi il punto interrogativo in figura viene rimpiazzato da un puntatore ad Object esso stesso.

Scarica subito una copia gratis

Scrivi un commento

Seguici anche sul tuo Social Network preferito!

Send this to a friend