Pattern Observer Symbian C++ Spiegazione
#1
Inviato 11 settembre 2008 - 14:38
qualcuno di voi saprebbe spiegarmi come usare il pattern observer in symbian, ho trovato del materiale in rete ma in lingua inglese e non sono stato in grado di capire praticamente niente.
Naturalmente sono ben accetti anche dei codici di esempio.
Grazie a tutti.
#2
Inviato 11 settembre 2008 - 18:14
Questo l'esempio piu' semplice (riporto solo le parti salienti)... Eventualmente, si puo' anche "complicare" a piacimento, sostituendo ad esempio iObserver con una lista di MObserver.
class MObserver
{
virtual void Notify()=0;
}
class CObservable : CBase
{
CObservable(MObserver& obs);
private:
void DoNotify();
MObserver* iObserver;
}
void CObservable::DoNotify()
{
iObserver->Notify();
}
Messaggio modificato da Il.Socio il 11 settembre 2008 - 18:14
#3
Inviato 12 settembre 2008 - 11:25
CObservable(MObserver& obs);
Questo pezzo di codice suppone che io debba passare un riferimento ad una classe astratta? Ma mi ricordavo che non era possibile istanziare oggetti di questo tipo... Ho semrpe trovato esempi simili a quello che mi hai fatto te, grazie per il tempo dedicatomi, ma non riesco veramente a capire quale sia il loro funzionamento.
#4
Inviato 12 settembre 2008 - 11:36
qwertyuiopearendil, il 12/09/2008 - 12:25, ha scritto:
CObservable(MObserver& obs);
Questo pezzo di codice suppone che io debba passare un riferimento ad una classe astratta? Ma mi ricordavo che non era possibile istanziare oggetti di questo tipo... Ho semrpe trovato esempi simili a quello che mi hai fatto te, grazie per il tempo dedicatomi, ma non riesco veramente a capire quale sia il loro funzionamento.
la classi astratte sono classi che contengono solitamente solo delle funzioni virtuali (puoi crearle tu e chiamarle a tuo piacimento ovviamente), se tu passi ad 1 classe che deve svolgere determinate funzioni questo oggetto astratto, quando ci sono sviluppi con le operazioni che deve svolgere la classe (ha finito, ci sono stati errori ecc) puoi fare una chiamata ad una funzione virtuale di MObserver, da ricordare che poi non dovrai instanziare una vera e propria classe MObserver, come dicevi tu non si può, ma dovrai ereditarla da una delle tue classi, e nella classe che erediti, devi esplicitare le funzioni virtuali dichiarate nella classe MObserver, inoltre quando crei la classe CObservable, alla classe per passare un oggetto MObserver, passerai un'istanza stessa della classe che eredita MObserver, e non un vero oggetto MObserver.
Cmq si symbian c++ ho visto anche io, è pieno di queste cose! Per non parlare delle classi con gli activeobject.. o.O
ps: cn il symbian c++ non sono per niente esperto, cmq spero di aver capito di cosa parlavate e di non aver dato una risposta fuorviante! =)
ciao
#5
Inviato 12 settembre 2008 - 18:14
In questo caso CProva contiene CObservable ed e' un MObserver... ma CObservable eventualmente potrebbe trovarsi "altrove", in tal caso, non passerai "*this" in fase di creazione dell'istanza CObservable, ma passerai il riferimento all'instanza CProva.
class CProva : public CBase, public MObserver
{
void ConstrucL();
void Notify();
private:
CObservable* iObservable;
}
void CProva::ConstrucL()
{
iObservable = CObservable::NewL(*this);
}
void CProva::Notify()
{
// TODO: Callback richiamata da iObservable...
}
Messaggio modificato da Il.Socio il 12 settembre 2008 - 18:18
#6
Inviato 13 settembre 2008 - 23:46
Il.Socio, il 12/09/2008 - 19:14, ha scritto:
In questo caso CProva contiene CObservable ed e' un MObserver... ma CObservable eventualmente potrebbe trovarsi "altrove", in tal caso, non passerai "*this" in fase di creazione dell'istanza CObservable, ma passerai il riferimento all'instanza CProva.
class CProva : public CBase, public MObserver
{
void ConstrucL();
void Notify();
private:
CObservable* iObservable;
}
void CProva::ConstrucL()
{
iObservable = CObservable::NewL(*this);
}
void CProva::Notify()
{
// TODO: Callback richiamata da iObservable...
}
Quindi posso dire che in questo caso la classe CProva è l'pggetto che voglio tenere d'occhio?
Altra cosa, visto che hai tirato fuori il discorso, mi puoi dare delle lucidazione sul funzionamento e utilizzo dei metodi di callback...?
Grazie e scusate la mia ignoranza.
#7
Inviato 14 settembre 2008 - 16:24
CProva e' l'oggetto che tiene d'occhio (e' un MObserver).
L'oggetto che vuoi tenere d'occhio e' iObservable (e' un CObservable).
Qui puoi trovare una definizione appropriata per quel riguarda le callback.
Nel nostro caso il metodo di callback e' il Notify() che CObservable richiama per fornire una notifica, tuttavia, non deve curarsi di come questa notifica sara' trattata... La gestione della notifica dipende da chi implementa il metodo Notify(), nel nostro caso CProva...
#8
Inviato 14 settembre 2008 - 22:30
Il.Socio, il 14/09/2008 - 17:24, ha scritto:
Quindi nell'esempio che mi avevi precedentemente postato:
class MObserver
{
virtual void Notify()=0;
}
class CObservable : CBase
{
CObservable(MObserver& obs);
private:
void DoNotify();
MObserver* iObserver;
}
void CObservable::DoNotify()
{
iObserver->Notify();
}Chi osserva chi?
Ultima cosa, potresti postare o mandarmi per posta un esempio completo in cui specifichi chi osserva chi e un metodo di callback per poterlo provare sull'emulatore. Naturalmente se non è un problema o ti fa perdere troppo tempo.
Grazie infinite cmq della vostra disponibilità.
Messaggio modificato da qwertyuiopearendil il 14 settembre 2008 - 22:38
#9
Inviato 15 settembre 2008 - 00:38
Un esempio completo lo trovi qui (in questo caso viene gestito un'array di observer):
e' in java, ma integrando con le definizioni che ti ho riportato poco sopra dovresti riuscire ad orientarti...
la classe Subject e' CObservable
l'interfaccia IObserver e' MObserver
il metodo Update() e' Notify()
la classe Observer1 e' CProva

Aiuto














Pubblicità