[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