Disons, surtout, que le principe est un principe de conception et que le langage n'est "qu'un outil" qui permet de le mettre en oeuvre, quel que soit la manière dont le langage l'apréhende
Mais il est aussi vrai que Mme Liskov fait, explicitement, référence à des langages orientés objets et indique clairement que c'est quelque chose de difficile à envisager hors de ce contexte
Attention, les concepts tels qu'ils étaient envisagés en C++ (car il n'ont pour finir pas été retenus dans la norme, malheureusement), sont une technique de programmation générique, et donc "hors scope" du LSP qui reste, malgré tout, un principe de conception OO.Après, c’est peut-être aussi moi qui vais un peu au-delà de l’énoncé initial. Mais ce n’est pas grave et je le maintiens, LSP ne saurait se limiter à l’héritage : un très bon exemple est les concepts c++.
D'autant plus que les concepts C++ n'ont strictement rien à voir avec la substituabilité, mais permettent "juste" (enfin, ce n'est déjà pas si mal, hein) de s'assurer que des classes sans rapport entre elles présente une interface représentant une capacité (ou un ensemble de capacités) exposée par le type d'objet concerné
L'idée des concepts C++ est de d'accepter (ou non) de travailler avec des objets qui présentent des caractéristiques vérifiant le fait que l'objet est (par exemple) copiable, comparable par égalité, comparable par plus petit ou autre caractéristiques n'impliquant pas forcément une relation de subsituabilité
C'est en effet un très mauvais exemple, car la solution la "moins mauvaise" consiste, en effet, à faire du "type ereasure" qui est, une fois de plus, hors scope du LSP, vu que la technique est... une technique de programmation génériqueUn cas classique est le stockage d’objets différents dans un même conteneur. Mais c’est quand même un mauvais exemple : chaque fois qu’on peut, il vaut mieux utiliser un variant qu’une hiérarchie pour faire ça
A vrai dire, selon le coté d'où l'on se place, C# et java ont soit fait une très grosse erreur de conception dans le sens ou l'on peut difficielement estimer que "tout et n'importe quoi" puisse avoir une base commune dans le respect de LSP, soit poussé le raisonnement un peu trop loin et se sont trompés dans la "granularité" qu'ils ont utilisé lorsqu'ils ont réfléchi en terme d'héritage.(malheureusement, en java ou c#, on n’a pas vraiment le choix).
Cependant, il faut leur laisser une chose : un garbage collector aurait été particulièrement difficile (pour ne pas dire impossible) à mettre en oeuvre s'ils n'avaient pas fait en sorte que toute classe hérite (de manière directe ou indirecte) d'une classe commune (Object)
Note aussi que, pour autant que je m'en souvienne, java implémente maintenant le "generics" qui permettent (ou du moins sont sensé permettre, car je ne les connais pas assez pour me risquer à émettre un jugement quelconque dessus) de faire sensiblement la même chose
Enfin, je reste vraiment très circonspect quant à l'idée de faire cohabiter une voiture et une banane dans une seule et même collection, et je ne l'accepterai vraiment que si je n'ai pas d'autre choix![]()
Partager