16.06.2013 Views

2 - Amiga Magazine Online

2 - Amiga Magazine Online

2 - Amiga Magazine Online

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

BERNARDO INNOCENTI<br />

OM-SET e OM-GET<br />

Implementazione e uso<br />

delle classi Boopsi<br />

Usando il metodo OM-SET è possibile impostare contemporaneamente<br />

diversi attributi, alcuni dei quali possono essere<br />

ereditati da una delle superclassi dell'oggetto. I1 dispatcher<br />

deve analizzare uno per volta gli attributi contenuti<br />

nella TagList del messaggio opSet e per ognuno di essi<br />

decide cosa fare. Se la TagList - contiene degli attributi sconosciuti,<br />

il dispatcher deve passarla alla propria superclasse<br />

in modo che abbia la possibilità di aggiornare di conse-<br />

Il dispatcher (parte III)<br />

nere una variabile LONG, e tutti i tipi di dimensione inferio-<br />

re devono essere promossi a LONG. Se l'attributo richiesto<br />

non viene riconosciuto, il dispatcher deve sottoporre il mes<br />

saggio OM-GET alla propria superclasse. La documentazio-<br />

ne sul codice di ritorno corretto per questo metodo è con-<br />

traddittoria: l'autodoc di GetAttr() sostiene che la funzione<br />

ritorna FALSE quando I'attributo non è stato riconosciuto,<br />

mentre l'appendice B del RKRM dichiara che il risultato di<br />

OM-GET non è definito. Nel dubbio, conviene attenersi<br />

all'autodoc di GetAttrs( ) e ritornare un valore diverso da ze-<br />

ro per gli attributi riconosciuti &l dispatcher.<br />

Notifica<br />

guenza i dati contenuti nella propria istanza. Si veda il Listato<br />

2.<br />

I1 sistema di notifica Boopsi permette di trasmettere a un<br />

oggetto, detto turget, tutti i cambiamenti che avvengono<br />

I1 risultato di OM-SET non è definito esplicitamente, ma in<br />

genere le classi ritornano il valore O quando gli attributi impostati<br />

non hanno causato alcun<br />

negli attributi di un altro oggetto. I tre elementi che entrano<br />

in gioco nella notifica sono:<br />

cambiamento visivo nell'oggetto,<br />

un valore diverso da zero in caso<br />

contrario.<br />

Object * MYCLASS-OMNew(C1ass *cl, Class *trueclass, struct opSet *msg)<br />

i<br />

Object *obj;<br />

OM-GET è il metodo che permette<br />

alle applicazioni di leggere il valore<br />

di un attributo. Viene invocato uti-<br />

/* Passa il messaggio OM-NEW alla superclasse */<br />

obj = DoSuperMethodA (cl, (Object *)trueclass, (Msg) msg);<br />

lizzando la funzione di Intuition i£ (obj)<br />

GetAttr( ). Il messaggio associato a<br />

{<br />

questo metodo è così definito:<br />

struct MyClassData *myclassdata;<br />

/* Ottiene il puntatore ai dati dell'istanza */<br />

struct opGet<br />

{<br />

ULONG MethodID;<br />

ULONG opgAt tr ID ;<br />

myclassdata = (struct MyClassData *) INST-DATA (cl, obj);<br />

/* Inizializza i dati dell'istanza */<br />

myclassdata->Attributo1 = GetTagData (<br />

MYCLASS-Attributol, ATTRIBUTOl-DEFAULT, msg->opsAttrList);<br />

myclassdata->Attributo? = GetTagData (<br />

><br />

ULONG *opg_Storage;<br />

MYCLASSAttributo2, ATTRIBUT02_DEFAULT, msg->opsAttrList);<br />

...<br />

I1 dispatcher deve copiare nel buf-<br />

1<br />

return obj;<br />

fer puntato da opg-Storage il valore<br />

dell'attributo opg-AttrID. Per<br />

}<br />

convenzione il buffer fornito deve<br />

essere abbastanza grande da conte-<br />

Listato I.

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

Saved successfully!

Ooh no, something went wrong!