16.06.2013 Views

posta - Amiga Magazine Online

posta - Amiga Magazine Online

posta - Amiga Magazine Online

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!