This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
in204:tds:sujets:td2:part2 [2022/09/14 08:41] bmonsuez [Question n°1] |
in204:tds:sujets:td2:part2 [2022/11/18 10:49] (current) |
||
---|---|---|---|
Line 94: | Line 94: | ||
<hidden Correction> | <hidden Correction> | ||
- | <nodisp 2> | ||
L'ensemble des méthodes de ''MyCounter'' doivent être présentes dans la classes ''BaseCounter'' à l'exception de la méthode ''increment''. | L'ensemble des méthodes de ''MyCounter'' doivent être présentes dans la classes ''BaseCounter'' à l'exception de la méthode ''increment''. | ||
En effet, ces méthodes sont communes aux trois classes ''ForwardCounter'', ''ReverseCounter'' et ''BiDiCounter''. | En effet, ces méthodes sont communes aux trois classes ''ForwardCounter'', ''ReverseCounter'' et ''BiDiCounter''. | ||
- | </nodisp> | ||
</hidden> | </hidden> | ||
Line 107: | Line 105: | ||
<hidden Correction> | <hidden Correction> | ||
- | <nodisp 2> | ||
Une proposition pour la classes ''BaseCounter'' serait la classe suivante : | Une proposition pour la classes ''BaseCounter'' serait la classe suivante : | ||
Line 151: | Line 148: | ||
Nous supposons que la classe ''BaseCounter'' n'est qu'une pure classe de base, c'est-à-dire qu'aucun objet de type ''BaseCounter'' sera créé. Pour éviter de pouvoir créer un objet de type ''BaseCounter'', nous modifions la visibilité des constructeurs de constructeurs ''public'' en constructeur ''protected''. Désormais, les constructeurs ne pourront être appelés que par des classes qui dérivent de la classe ''BaseCounter'', interdisant ainsi la possibilité de créer accidentellement un objet de type ''BaseCounter''. | Nous supposons que la classe ''BaseCounter'' n'est qu'une pure classe de base, c'est-à-dire qu'aucun objet de type ''BaseCounter'' sera créé. Pour éviter de pouvoir créer un objet de type ''BaseCounter'', nous modifions la visibilité des constructeurs de constructeurs ''public'' en constructeur ''protected''. Désormais, les constructeurs ne pourront être appelés que par des classes qui dérivent de la classe ''BaseCounter'', interdisant ainsi la possibilité de créer accidentellement un objet de type ''BaseCounter''. | ||
- | </nodisp> | ||
</hidden> | </hidden> | ||
Line 161: | Line 157: | ||
<hidden Correction 1 - Héritage Simple> | <hidden Correction 1 - Héritage Simple> | ||
- | <nodisp 2> | + | |
Cette correction propose de créer trois classes ''ForwardCounter'', ''BackwardCounter'' et ''BiDiCounter'' qui héritent de la classe ''BaseCounter'' en l'étendant avec les fonctions manquantes : | Cette correction propose de créer trois classes ''ForwardCounter'', ''BackwardCounter'' et ''BiDiCounter'' qui héritent de la classe ''BaseCounter'' en l'étendant avec les fonctions manquantes : | ||
Line 230: | Line 226: | ||
</code> | </code> | ||
- | </nodisp> | ||
</hidden> | </hidden> | ||
<hidden Correction 2 - Héritage Simple en factorisant l'implantation des fonctions ''increment'' et ''decrement''> | <hidden Correction 2 - Héritage Simple en factorisant l'implantation des fonctions ''increment'' et ''decrement''> | ||
- | <nodisp 2> | ||
Dans l'exemple précédent, nous constatons que nous définissons deux fois le code pour la fonction ''increment'' et la fonction ''decrement'', ce qui conduit à dupliquer le code et surtout à devoir si jamais nous trouvons une erreur dans une des fonctions membres ''increment'' (resp. ''decrement'') de devoir penser à corriger la deuxième implantation de la fonction membre ''increment'' (resp. ''decrement''). | Dans l'exemple précédent, nous constatons que nous définissons deux fois le code pour la fonction ''increment'' et la fonction ''decrement'', ce qui conduit à dupliquer le code et surtout à devoir si jamais nous trouvons une erreur dans une des fonctions membres ''increment'' (resp. ''decrement'') de devoir penser à corriger la deuxième implantation de la fonction membre ''increment'' (resp. ''decrement''). | ||
Line 342: | Line 336: | ||
</code> | </code> | ||
- | </nodisp> | ||
</hidden> | </hidden> | ||
<hidden Correction 3 - Héritage Multiples> | <hidden Correction 3 - Héritage Multiples> | ||
- | <nodisp 2> | ||
A priori, ''BiDiCounter'' a besoin à la fois de la méthode ''increment'' qui est défini dans ''ForwardCounter'' et de la méthode ''decrement'' qui est défini dans ''BackwardCounter''. Il serait tentant de dire, puisque C++ supporte l'héritage multiple, que ''BiDiCounter'' hérite à la fois de ''ForwardCounter'' et de ''BackwardCounter''. | A priori, ''BiDiCounter'' a besoin à la fois de la méthode ''increment'' qui est défini dans ''ForwardCounter'' et de la méthode ''decrement'' qui est défini dans ''BackwardCounter''. Il serait tentant de dire, puisque C++ supporte l'héritage multiple, que ''BiDiCounter'' hérite à la fois de ''ForwardCounter'' et de ''BackwardCounter''. | ||
Line 462: | Line 454: | ||
Ceci permet de comprendre que l'héritage multiple est intéressant conceptuellement, puisqu'il permet d'hériter de plusieurs comportements. Cependant, sa mise en oeuvre est relativement simple pour des cas où les classes dont on hérite ne dérivent pas d'une même classe de base. Si c'est le cas, il faut recourir à un héritage faisant référence aux classes qui est nettement moins intuitif et peut même conduire à des erreurs. En effet, il est nécessaire de créer l'instance qui sera partagée entre les différentes classes et à défaut de création explicite, s'il existe un constructeur par défaut, C++ utilisera ce constructeur par défaut pour initialiser l'objet partagé, même si ce n'était pas votre souhait mais simplement un oubli de votre part. | Ceci permet de comprendre que l'héritage multiple est intéressant conceptuellement, puisqu'il permet d'hériter de plusieurs comportements. Cependant, sa mise en oeuvre est relativement simple pour des cas où les classes dont on hérite ne dérivent pas d'une même classe de base. Si c'est le cas, il faut recourir à un héritage faisant référence aux classes qui est nettement moins intuitif et peut même conduire à des erreurs. En effet, il est nécessaire de créer l'instance qui sera partagée entre les différentes classes et à défaut de création explicite, s'il existe un constructeur par défaut, C++ utilisera ce constructeur par défaut pour initialiser l'objet partagé, même si ce n'était pas votre souhait mais simplement un oubli de votre part. | ||
- | </nodisp> | ||
</hidden> | </hidden> | ||
Line 493: | Line 484: | ||
<hidden Correction> | <hidden Correction> | ||
- | <nodisp 2> | ||
Il suffit de tester les codes et de s'assurer du bon fonctionnement. | Il suffit de tester les codes et de s'assurer du bon fonctionnement. | ||
- | </nodisp> | ||
</hidden> | </hidden> | ||