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.