[Squeak-fr] Equivalent des interfaces callback du C++
Vicnet
oselev at yahoo.fr
Dim 24 Aou 07:51:42 UTC 2008
Bonjour,
Damien Cassou a écrit :
> j'aimerai bien t'aider, mais je n'ai absolument rien compris :-).
> Pourrais-tu donner un exemple ?
Oui voila en C++:
class I {
virtual void callback() = 0;
};
class A : public virtual I
{
virtual void callback() {
std::cout << "Je suis prévenu maintenant !";
}
};
class B
{
Enfant(I* i) : _i(i) { }
void evennement() {
_i->callback();
}
I* _i;
};
A a;
B b(a);
b.evennement();
a est prévenu d'un évennement par un b sans que b ne connaisse tout de
a. A et B sont découplés.
Zn java, il y a directement le mot clef interface.
Il y a un 'contrat' I entre les deux que chacun doit respecter/utiliser.
En smalltalk, le 'contrat' semble implicite. Voici ce que je fais en
squeak (peut etre faudrait-il mettre les methode sous la forme
Object>>methode mais je ne suis pas sur de la syntaxe):
Object subclass: #A
...
callback
Transcript print: "Je suis prévenu maintenant !"; cr.
Object subclass: #B
instanceVariableNames: 'i'
...
evennement
i callback.
|a b|
a := A new.
b := B new.
b evennement. "a est prévenu !"
a est prévenu mais le contrat n'est pas matérialisé par un objet.
Quand on implémente A, on peut oublier de déclarer callback si personne
ne nous le dit !
Est-ce la bonne façon de faire ?
Merci,
Vincent
> 2008/8/22 Vincent Osele <oselev at yahoo.fr>:
>>
>> Venant du monde C++, j'ai quelques réflexes qu'il faut que je transforme en
>> équivalent smalltalk.
>>
>> Quand on veut prévenir un autre objet d'un niveau hiérarchique inférieur (un
>> parent par exemple), on créé une interface callback (classe abstraite pure)
>> qu'on fait hériter par le parent, ce dernier passant un pointeur de ce type (cad
>> lui même puisqu'il hérite) au fils qui utilise les méthode de l'interface (par
>> ce pointeur) pour prévenir le parent.
>>
>> Comment fait-on l'équivalent en smalltalk puisque le double héritage n'existe
>> pas et que tout dérive au moins de objet ?
>>
>>
>> D'après ce que je comprends, on ne fait pas !
>> On appel directement la méthode et si ca matche, ca ira la ou il faut ! (sinon on aura un 'messageNotUnderstood')
>>
>> Cad par exemple
>> Dans le fils (qui est un héritier de morph):
>> action
>> owner moncallback
>>
>> Dans le père:
>> moncallback
>> ...
>>
>> Les méthodes à 'hériter' sont définies par un contrat tacite entre les classes,
>> non ?
>> Il n'y a pas plus explicite ?
Plus d'informations sur la liste de diffusion Squeak-fr