• [^] # Réponse groupée

    Posté par . En réponse au journal Repenser les langages et le développement logiciel. Évalué à 5.

    Sylvain Sauvage :
    Oui. Le classique cas: classe A avec attribut a, classe B et C qui héritent de A et classe D qui hérite de B et C. L'attribut a est hérité deux fois par D. Comment gérer ça ? Qu'est-ce que cela peut bien signifier ?
    Parfois, le programmeur voudrait deux a, parfois il n'en veut qu'un. C'est donc aussi un problème dans la tête du programmeur.

    golum :
    Soit une classe A qui définit une méthode m.
    Soit B et C qui héritent de A et qui redéfinissent m.
    Soit D qui hérite de B et C mais qui ne redéfinit pas m.
    Quel redéfinition de m va utiliser un appel à la méthode de m par une instance de D ? Le langage résoudra le pb (descente en profondeur d'abord pour Pyhton par exemple) , mais le developpeur devra l'anticiper. Pour certains langages ,il peut indiquer explicitement la méthode m de la classe mère qu'il souhaite utiliser. Mais dans la réalite la classe B a pu n'être créer qu'après la classe D. Donc il faut repasser sur tout le code utilisateur pour désambiguer, ce qui va à l'encontre des concepts d'evolutivité de l'appproche objet.
    Le C++ prévoit très bien ce cas avec la présence ou non du mot-clé 'virtual'.
    Soit une classe de base A avec un membre a, plusieurs classes B0, B1... Bn qui hérite de A, et une classe C qui hérite de B0, B1... Bn. A la définition de 2 classes Bi et Bj, si le mot-clé 'virtual' apparaît pour A, alors A sera le même -> structure en diamant. Autrement, à la définition d'une classe Bi où 'virtual' n'apparaît pas, Bi aura sa propre copie de A.
    Dès lors que le mot-clé 'virtual' est absent pour un Bi, il y a conflit dans C et il faudra préciser le Bi.
    Ca manque d'image ? http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vc(...)

    Je suis d'accord. Qu'est-ce que tout cela peut bien signifier.
    Peut-on encore parler d'héritage ou juste de sucre syntaxique.
    En C++, il ne faut plus voir une utilisation de l'héritage comme étant systématiquement de l'héritage. Quelle différence entre class B : private A {}; et class B { A a; }; ?
    Une implémentation en C++ n'est plus un simple calque du diagramme UML. Mais en l'absence de syntaxe pour déléguer facilement, je suis bien content d'avoir l'héritage multiple.