Programmazione orientata agli oggetti in ANSI-C. Creare Sottoclassi – Any

Data la descrizione di Class e Object, possiamo già creare nuovi oggetti e anche una nuova sottoclasse. Come esempio, consideriamo una sottoclasse Any che dichiara che tutti i suoi oggetti sono uguali a un qualsiasi altro oggetto, in altre parole Any sovrascrive differ() in modo da restituire sempre zero.

Ecco l'implementazione di Any e una porzione di codice per fare un test rapido del funzionamento, il tutto in un file chiamato any.c

#include "Object.h"
static int Any_differ (const void * _self, const void * b)
{
return 0; /* Any equals anything... */
}

int main ()
{ void * o = new(Object);
const void * Any =
new(Class, "Any", Object, sizeOf(o),
differ, Any_differ,
0);
void * a = new(Any);
puto(Any, stdout);
puto(o, stdout);
puto(a, stdout);
if (differ(o, o) == differ(a, a))
puts("ok");
if (differ(o, a) != differ(a, o))
puts("not commutative");
delete(o), delete(a);
delete(Any);
return 0;
}

Se implementiamo una nuova classe avremo bisogno di includere l'interfaccia della sua superclasse. Any ha la stessa rappresentazione di Object e la classe è così semplice di per sé che non abbiamo la necessità di includere il file di rappresentazione della superclasse. La descrizione della classe Any viene creata richiedendo una nuova istanza dalla sua metaclasse Class e costruendola con il nuovo nome della classe, la descrizione della superclasse e la dimensione di un oggetto della nuova classe.

const void * Any =
new(Class, "Any", Object, sizeOf(o),
differ, Any_differ,
0);

Inoltre, specifichiamo esattamente quei metodi dinamicamente linkati che devono essere sovrascritti nella nuova classe. I nomi dei metodi possono apparire in un ordine qualsiasi, ognuno però deve essere preceduto dal suo selettore. Uno zero termina la lista.

Questo programma genera una istanza o di Object e una istanza a di Any e mostra a video la nuova descrizione di classe e le due istanze. Entrambe le istanze non possono differire da se stesse, pertanto il programma stampa ok. Il metodo differ() è stato sovrascritto in Any, quindi otterremo risultati diversi se confrontiamo o con a o viceversa.

$ any
Class at 0x101fc
Object at 0x101f4
Any at 0x10220
ok
not commutative
Any: cannot destroy class

Chiaramente, non dovremmo essere capaci di andare a cancellare una descrizione di classe. Questo errore viene già individuato durante la compilazione, poiché delete() non accetta un puntatore ad un'area protetta con const.

Scarica subito una copia gratis

Scrivi un commento

Seguici anche sul tuo Social Network preferito!

Send this to a friend