Aller au contenu

Discussion:Programmation C++/Les classes/Exercices

Le contenu de la page n’est pas pris en charge dans d’autres langues.
Ajouter un sujet
Un livre de Wikilivres.
Dernier commentaire : il y a 6 ans par Fenkys dans le sujet Des héritages aberrants

bonjour tout le monde si quelqu 'un peut me dire comment inserer des images merci davance Paloma01 30 août 2011 à 12:38 (CEST)Répondre

merci infiniment Mr davidl pour ton conseil et excuse moi si je n ai pas pu te contacter directement pare que tout simplement je n ai pas ton email ;concernant ma contribution au sujet de l heritage en c++ je l ai trouvé beaucoup plus mieux que la precedente c est pour cela que je l ai modifiée le plus important pour nous c est maximiser et adapter les information au lecteur c est ca notre defi c est pas important qui va vehiculer l information mais quelle est l information la plus complete et la plus facile a comprendre merciPaloma01 30 août 2011 à 15:35 (CEST)Répondre

Des héritages aberrants

[modifier le wikicode]

Bonjour, L'exercice proposant de faire hériter publiquement une classe Point3D d'une classe Point2D est une pure aberration du point de vue conceptuel.

Pour faire simple, ce genre de classe ce qu'il convient d'appeler une sémantique de valeur, dans le sens où:

  • il n'y a aucun problème à avoir, à un instant T, deux instances de Point2D (ou de Point3D) présentant exactement les mêmes valeurs en mémoire
  • il est tout à fait cohérent d'envisager d'assigner les valeurs d'une instance de Point2D (ou de Point3D) à une autre instance du même type
  • il est tout à fait cohérent d'envisager de copier les valeurs d'une instance de Point2D (ou de Point3D) pour créer une nouvelle instance du même type
  • il est tout à fait cohérent d'envisager de comparer deux instance de Point2D (ou deux instances de Point3D) entre elles, au minimum par égalité (et, dans le cas présent, les autres comparaisons sont également envisageables, d'ailleurs).

Or, il n'est pas possible d'implémenter une opération d'égalité réflexive, symétrique, et transitive qui soit compatible avec le LSP -- cf Effective Java de Joshua Bloch pour la démo. La criticité 3 premières propriétés ne devraient pas choquer. Le LSP, est probablement la propriété SOLID la plus critique de toutes. Si les autres (SRP, OCP, DIP, ISP) nous aident à concevoir un truc maintenable, un héritage qui ne respecte pas le LSP est un héritage qui va finir en bug -- la démonstration réside dans une application simple de la programmation par contrat.

Si bien que l'héritage public ne peut être envisagé que sur des classes qui présente ce qu'il convient d'appeler une sémantique d'entité dans le sens où lorsque l'on décide d'accéder à une instance particulière de la classe, on veut la garantie que nous accédons à cette instance particulière, à l'exception de toute autre, ce qui implique:

  • Qu'il doit être impossible d'avoir, à un instant T, deux instances de la classes présentant exactement les mêmes valeurs en mémoire. Il y aura toujours au moins une valeur qui fera office de "critère discriminant"
  • que l'on ne veut surtout pas être en mesure d'assigner les valeurs d'une instance de la classe à une instance différente
  • que l'on ne veut surtout pas être en mesure de copier les valeurs d'une instance de la classe pour creer une nouvelle instance
  • qu'il n'y a aucune raison d'envisager une comparaison "globale" (comprenez : de l'ensemble des valeurs représentées), vu que le "critère discriminant" empêche toute égalité d'une instance avec un instance autre que elle-même.

Des exemples "cohérents" de classes pouvant être utilisées dans le cadre d'un héritage public seraient:

  • une classe "CompteBanquaire" qui serait dérivée en "CompteCourant" et en "CompteDepargne"
  • une classe "Vehicule" qui serait dérivée en VehiculeAMoteur" et en "VehiculeAPedales"
  • une classe "Personnage" qui serait dérivée en "Magicien" et en "Guerrier"
  • une classe "Batiment" qui serait dérivée en "BatimentIndustriel" et "BatimentDeVie"
  • j'en passe, et sans doute de meilleures

Le premier exercice doit être changé Le deuxième est un non sens vu qu'on ne peut pas estimer qu'un véhicule EST-UNE position, ce qui est la signification de l'héritage Le troisième exercice n'a plus de sens une fois les deux premiers changement effectués

J'ai légèrement modifié le deuxième exercice pour le rendre cohérent. Je ne sais pas quoi faire du premier, la réponse ne répondant pas à l'énoncé qui n'a jamais dit de recréer un jeu de rôle.Fenkys (discussion) 10 avril 2018 à 09:21 (CEST)Répondre