Next: Terminologie
Up: Panoramique et comparaison de
Previous: Rappel sur l'origine de
Héritage, sous-typage et conformance
Il est nécessaire, pour pouvoir se démêler dans la bué vaseuse des concepts qui polluent le monde à objets, de distinguer clairement au moins entre la relation d'héritage, la relation de sous-typage et une forme plus faible de celle-ci qu'on appelle des fois la relation de ``conformance''.
- héritage
- la classe B est dérivée de la classe A (on réutilise le code, et on établi une relation is-a)
- polymorphisme contextuel
- les objets de la classe B peuvent être utilisés
dans un certain ensemble de contextes pas spécialement prévus pour eux.
- sous-typage
- les objets de la classe B peuvent être utilisés partout où on peut utiliser des objets de la classe A
- conformance
- les objets de la classe B savent répondre à un certain nombre de messages
(où l'on prend en compte le type du résultat et ceux des paramètres) et peuvent être
utilisés partout où il suffit de savoir répondre à ces messages.
On a des exemples désormais classiques qui montrent comment ces notions sont différentes.
- l'héritage n'est pas du sous-typage
- l'exemple classique de ce phénomène
est un programme qui contient une classe point et une classe point-coloré,
les deux ayant une méthode pour tester l'égalité de deux points.
Voici comment on écrirait un petit programme dans ce gendre en C++:#include <fstream.h> class Point { protected: int x; public: void setx(int y) {x=y;}; int getx() {return x;}; int eq(Point q) {return (q.getx() == x);} };
class ColorPoint: public Point {// n'est pas un sous-type de Point! char c; public: void setcol(char d) {free(c); c=(char )malloc(strlen(d)); strcpy(c,d);}; char getcol() {return c;}; int eq(ColorPoint q) {if (strcmp(q.getcol(),c)==0) {return Point::eq(q);} else {return 0;};} };
main() { Point p; ColorPoint q;
p.setx(3); q.setx(4); q.setcol("blue"); cout <<p.eq(p)<<"\n" <<p.eq(q)<<"\n" // <<q.eq(p) ERREUR: p n'a pas de composante couleur! <<q.eq(q)<<"\n" <<"Point at "<<p.getx()<<" "<<q.getcol() <<" Colorpoint at "<<q.getx()<<" "<<"\n";; }
- l'héritage n'est pas de la conformance
- le même exemple que ci-dessus montre cela aussi par rapport au protocole eq.
- la conformance n'est pas du sosu-typage
- la conformance est rélative à
à un protocole donné qui n'est pas forcement né d'une
classe, donc cd n'est pas exactement la même chose que le
sous-typage, mais cela revient quand même au sous-typage par
rapport à une classe hypothétique qui a exactement les
méthodes du protocole.
Next: Terminologie Up: Panoramique et comparaison de Previous: Rappel sur l'origine de Roberto DiCosmo
Mon Jun 3 18:29:31 MET DST 1996