Bonjour,
Comme tu le dis si bien, la notion d'interface est implicite et le contrat doit au mieux être exprimé dans les commentaires de méthode ou de classe. Souvent le contrat est exprimé à l'aide d'une classe abstraite et les méthodes obligatoires sont définies de manière abstraite (self subclassResponsibility). Ce n'est pas toujours possible (quand tu as besoin d'hériter d'autre chose) et dans ce cas on peut effectivement avoir des messageNotUnderstand si on n'a pas respecté le contrat.
Cordialement, Jean-François
Damien Cassou a écrit :
2008/8/24 Vicnet oselev@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.
Squeak-fr mailing list Squeak-fr@lists.squeakfoundation.org http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/squeak-fr