18.11.2012 Views

L - Amiga Magazine

L - Amiga Magazine

L - Amiga Magazine

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.

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.

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

Saved successfully!

Ooh no, something went wrong!