You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
Implementazione<br />
e uso delle classi Boopsi<br />
Riprendiamo l'esame del sistema Boopsi, esaminando varie<br />
funzioni e metodi inerenti l'uso e la creazione delle classi.<br />
Librerie di classi<br />
La funzione NewObject( ) di Intuition non è in grado di ca-<br />
ricare direttamente una classe Boopsi esterna dalla direc-<br />
tory "SYS:Classes/". Le classi Boopsi esterne sono in realtà<br />
delle librerie di Exec, che devono essere aperte con Open-<br />
Library( ) per poter usare le classi in esse contenute. in ge-<br />
nere queste librerie contengono solamente i primi quattro<br />
vettori di salto comuni a tutte le librerie di Exec, cioe Libo-<br />
pen( ), LibCloseO, LibExpunge( ) e LibExtFunc( ). Niente<br />
vieta di includerne delle altre, come nel caso del co-<br />
lorwheel.gadget, che offre due utili funzioni per la conver-<br />
sione tra i sistemi di colore RGB e HSV.<br />
Le applicazioni che usano una classe esterna devono opera-<br />
re in questo modo:<br />
struct Library *MyClassBase;<br />
MyClassBase=OpenLibrary("gadgets/myclass.gadget",<br />
if (MyClassBase)<br />
{<br />
39);<br />
myobj = NewObject (NULL,"myclass.gadgetM,<br />
TAG-DONE) ;<br />
if (myobj )<br />
i<br />
l<br />
[...usa l'oggetto ... ]<br />
DisposeObj ect (myobj ;<br />
Alla scoperta dell'ivniverso Boopsi @arte n/)<br />
verrà comunque caricata soltanto la prima volta che viene<br />
aperta e scaricata soltanto quando l'ultimo task la chiude.<br />
Al momento dell'inizializzazione, la libreria crea una nuova<br />
classe usando la funzione MakeClass( ) e la aggiunge alla<br />
lista delle classi pubbliche di Intuition chiamando Add-<br />
Class( ). È anche possibile creare una libreria che contenga<br />
al proprio interno più classi correlate tra loro, per esempio<br />
un toolkit completo per I'interfaccia utente.<br />
Normalmente le classi Boopsi esterne memorizzano il pun-<br />
tatore ritornato da MakeClass( ) all'interno della base della<br />
propria libreria, in modo da poterlo recuperare quando la<br />
libreria sarà espulsa dal sistema. In una prerelease del file<br />
include che avrebbe dovuto accompa-<br />
gnare la V42 di <strong>Amiga</strong>OS, è presente una definizione stan-<br />
dard della base per le classi Boopsi:<br />
struct ClassLibrary<br />
{<br />
1 ;<br />
struct Library cl-Lib;<br />
UWORD cl-Pad;<br />
Class *CI-Class;<br />
Usando questa struttura, il puntatore alla classe può essere<br />
recuperato direttamente dalla base della libreria (cl-Class).<br />
Questo permette all'utilizzatore di invocare i metodi della<br />
classe che non richiedono la creazione di un oggetto speci-<br />
fico. Esistono anche alcune classi Boopsi, per esempio i Da-<br />
tatypes, che forniscono una funzione che ritorna il puntato-<br />
re alla classe, chiamata ObtainEngine( ) oppure GetEngi-<br />
neo. Questa funzione deve occupare il primo vettore libero<br />
della tavola di salto della libreria (offset -30). Dal momento<br />
che esistono due modi diversi di ottenere il puntatore alla<br />
classe, gli implementatori di classi dovrebbero supportarli<br />
entrambi.<br />
CloseLlbrary (MyClassBase);<br />
Su Aminet e nell'higa Developer CD 1.1 si possono trovare<br />
numerosi esempi di classi Boopsi esterne. I sorgenti della<br />
La coppia di funzioni OpenLibrary()/CloseLibrary( ) garanti- classe esterna VectorGlyphIClass sono inclusi nel dischetto<br />
sce che il codice della classe rimanga in memoria finché allegato aila rivista unitamente alla stdrtup in assembler neesistono<br />
oggetti che ne fanno parte. Se più task tentano di cessaria per creare una libreria condivisa senza alcun suputilizzare<br />
la classe applicando questo protocollo, la libreria Porto diretto da Parte del compilatore.