La base de la confusion, c'est qu'il y a une différence de comportement entre instance et type.
Le LSP s'applique à des objets (donc des instances), pas des types. Et vous pouvez retourner les choses dans tous les sens, mais si b est une instance de type B, et a une instance de type A, je n'arrive pas à trouver une propriété q(x) telle que q(a) soit vraie et pas q(b). Par contre, j'arrive tout à fait à trouver des propriétés q2(X) telles que q2(A) soit vraie et pas q2(B). Mais ce n'est pas ma compréhension du LSP, qui s'intéresse aux instances et pas aux types.
Pour reprendre l'exemple que donnait Emmanuel :
Il me dérange beaucoup. Une instance en C++ n'a pas de fonction publique, c'est son type qui a des fonctions publiques. La notion de visibilité n'intervient absolument pas au niveau des instances, c'est une notion qui n'existe qu'à la compilation, elle est même perdue dans l'exécutable.Pour démontrer que le code présenté ci-dessus viole LSP, on pose juste q(x)=vrai si la fonction f() de x est publique pour tout x instance de A. Le reste vient tout seul, puisque q(y)=faux lorsque y est du type B (qui pourtant dérive de A).
Sinon, je vois un cas d'utilisation où ça pourrait peut-être servir. Je fais une nouvelle version de mon interface, j'utilise un héritage public pour garder la compatibilité. Si je désire déprécier une fonction, je la passe protected pour que les développements nouveaux ne l'utilisent pas. Ca ne casse par contre pas le code qui utilise l'ancienne interface. Ca me semble tiré par les cheveux et il y a d'autres moyens (meilleurs) de gérer ce cas, mais je n'ai pas vraiment d'autre idée...
Partager