[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