OVH Cloud OVH Cloud

Heritage multiple vs. composition

22 réponses
Avatar
Olivier Croquette
Bonjour,

je voudrais votre avis sur une utilisation de l'héritage multiple qui ne
parait pas courante.

Soit une classe véhicule, dont l'utilisateur doit pouvoir déterminer la
position et à la couleur.

Soit une implémentation basée sur l'héritage multiple:

class Color {
public:
SetColor(...);
protected:
double r,g,b,a;
}

class Position {
public:
SetPosition(...);
protected:
double x,y;
}


class Vehicule : public Position, public Color {
...
}

Note: les classes Vehicule, Position, Color sont spécifiées et
implémentées par les mêmes développeurs (ie. pas d'héritage multiple de
classes "externes").


En gros, l'héritage multiple est utilisé pour ajouter en même temps une
interface et une implémentation à une classe.


Les avantages de cette implémentation sont les suivants:

- syntaxe très simple au niveau de Vehicule pour rajouter de nouvelles
propriétés

- très peu d'effort au niveau de Vehicule pour rajouter de nouvelles
propriétés

- Vehicule hérite automatiquement de toutes amélioration à Position
Par exemple, si SetPositionX() et SetPositionY() sont implémentées
dans Position(), Vehicule en profite automatiquement.

- syntaxe très simple pour l'utilisateur, qui n'a qu'à qu'à faire
monvehicule.SetColor()

Une limitation (au moins) est qu'on est embêté si le véhicule doit un
jour devenir bicolore.

A part ça, l'héritage multiple étant souvent sujet à controverse, y
a-t'il un risque particulier à une telle implémentation?
Quels sont les précautions à prendre?

2 réponses

1 2 3
Avatar
Fabien LE LEZ
On Thu, 17 Aug 2006 13:26:45 +0200, Alain Gaillard
:

A moins que je n'ai perdu le fil en cours de route, ce n'est pas à peu
près la même chose.


Tu as perdu le fil en cours de route.

Étant donnée une classe "Position" (avec des fonctions publiques), il
s'agit de comparer

class Vehicule: public Position
{
};

et

class Vehicule
{
public: Position pos;
};


Dans les deux cas, on a bien accès à tous les membres publics de la
classe "Position".

Avatar
Alain Gaillard


Tu as perdu le fil en cours de route.

Étant donnée une classe "Position" (avec des fonctions publiques), il
s'agit de comparer

class Vehicule: public Position
{
};

et

class Vehicule
{
public: Position pos;
};


Dans les deux cas, on a bien accès à tous les membres publics de la
classe "Position".



Ah ok.


--
Alain

1 2 3