posta - Amiga Magazine Online
posta - Amiga Magazine Online
posta - Amiga Magazine Online
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
Tecniche di programmazione<br />
orientate all'oggetto in C<br />
Paolo Sommaruga<br />
Questa volta dobbiamo esaminare il secondo approccio<br />
a11'OOP ed esaminare piìi da vicino l'implementazione<br />
pratica di entrambi i metodi.<br />
La seconda ipotesi<br />
Tale approccio è meno didattico del primo. Avrete forse<br />
notato che la tecnica precedente, i cui esempi compaiono<br />
nella directory T1 sul dischetto, si preoccupa di molti<br />
dettagli e nei casi più semplici si dimostra ridondante. In<br />
questo secondo approccio (directory T2 sul dischetto) si<br />
risolve tale problema usando più strutture, un vettore di<br />
puntatori a funzione e meno "#definen. Essa prevede in<br />
primo luogo di definire METODO e CLASSE come strutture:<br />
typedef struct metodo<br />
t<br />
int<br />
* /<br />
mtd-Ident; /* identificatore numerico<br />
FUNCTIONP mtdMetodo; /* puntatore a funzione */<br />
} MTD;<br />
typedef struct classe<br />
t<br />
char cls>ome[ NOMECLASSE 1; /* nome classe */<br />
MTD *cls-pMetodi; /* puntatore a<br />
vettore di metodi */<br />
void *cls-pAntenato;<br />
classe */<br />
} CLS;<br />
/* puntatore a<br />
I1 tipo metodo contiene, dunque, la funzione, identificata<br />
da un numero, mentre il tipo classe contiene un nome, un<br />
puntatore al metodo e uno a un'altra classe. Un oggetto,<br />
sempre definito come struttura, diventa un membro della<br />
propria classe, con proprietà e dati privati:<br />
typedef struct oggetto<br />
1<br />
CLS *ogt - pclass; /* puntatore a classe */<br />
void *ogtpProps; /* proprietà */<br />
void *ogt-pData; /* dati */<br />
} OGT;<br />
Notiamo innanzitutto che l'antenato viene indicato nella<br />
Parte seconda: gli esempi<br />
classe. I1 posto gli si addice, perché in tal modo la catena<br />
ereditaria si forma al livello logico più indicato. I1 procedi-<br />
mento logico esatto non è infatti quello di derivare nuovi<br />
oggetti, ma quello di derivare nuove classi che permettono<br />
di creare nuovi oggetti.<br />
La classe presenta, inoltre, un puntatore al vettore dei<br />
metodi. Ma perché proprio un vettore? Perché permette di<br />
implementare una "tavola": c'è un grande vantaggio nel<br />
loro uso. I1 costrutto "switch", usato la scorsa volta, è sì<br />
estensibile, ma l'aggiunta di nuove "case" richiede una<br />
nuova compilazione di tutto il codice e può andare a<br />
interferire con il comportamento di altri oggetti. Una tavola,<br />
invece, termina con un marcatore e le funzioni che la<br />
gestiscono usano "while" (non "for") per scandirla, cioè<br />
non presumono che essa abbia una lunghezza predefinita,<br />
ma ne esaminano ogni elemento finché non si imbattono<br />
nel terminatore. Per questo motivo, una libreria indicizzata<br />
con una tavola può essere ampliata senza influire sul<br />
comportamento dei programmi più vecchi. Un oggetto i cui<br />
metodi stiano in una tavola è dunque molto più flessibile:<br />
la derivazione o estensione di qualunque classe non inter-<br />
ferisce più con antenati e parenti, come avveniva usando<br />
"switch".<br />
Gli oggetti di un autentico linguaggio Object Oriented<br />
risolvono alla base il problema, s<strong>posta</strong>ndo il momento del<br />
"binding". Con tale termine si indica l'operazione che<br />
effettua il linker nel momento in cui risolve le chiamate di<br />
funzione di uno o più moduli oggetto, ponendo nell'ese-<br />
guibile l'indirizzo delle funzioni richieste. Per tale motivo i<br />
linguaggi come il C si dicono "early bound": le chiamate<br />
interne vengono infatti risolte e convalidate durante il<br />
linking. Un linguaggio Object Oriented sfrutta al contrario<br />
una tecnica di "late binding", inmodo molto simile a ciò che<br />
accade per le chiamate di libreria su <strong>Amiga</strong>. Le librerie<br />
shared possono essere considerate oggetti, i cui riferimenti<br />
vengono risolti definitivamente solo in "run-time", cioè al<br />
momento dell'esecuzione. Questa è esattamente una tecni-<br />
ca di "late binding".<br />
Le proprietà e i dati possono essere indicati servendosi<br />
ancora dei file ".pn spiegati la volta scorsa, anche se il<br />
meccanismo adottato per I'ereditarietà in questa tecnica<br />
permetterebbe una soluzione diversa. Di fatto, ho preferito