next up previous contents index
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 up previous contents index
Next: Terminologie Up: Panoramique et comparaison de Previous: Rappel sur l'origine de

Roberto DiCosmo
Mon Jun 3 18:29:31 MET DST 1996