[Squeak-fr] Equivalent des interfaces callback du C++
Damien Cassou
damien.cassou at gmail.com
Dim 24 Aou 09:34:47 UTC 2008
2008/8/24 Vicnet <oselev at yahoo.fr>:
> 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 ?
Oui, c'est la bonne façon de faire en général je pense.
--
Damien Cassou
Peter von der Ahé: «I'm beginning to see why Gilad wished us good
luck». (http://blogs.sun.com/ahe/entry/override_snafu)
Plus d'informations sur la liste de diffusion Squeak-fr