JackosKingLe 09/05/2010 à 12:54
Bon alors petit retour sur le rectangle.
Brunni a la solution la plus élégante à mon gout: equilibre entre simplicité et respect des contrats. Elle permet aussi de factoriser assez facilement le code.
La solution de KK est une bonne branlette intellectuelle où on arrive à la fin en se demandant pourquoi on a une abstraction ModifySquare et AbstractRectangular. On a un héritage multiple (en C++), et aucune factorisation du code. C'est très alléchant sur le papier, mais peut utile je trouve dans un cas concret!
Sinon dommage Folco que tu n'ais pas présenté ta solution!
L'erreur que souvent un débutant commet est l'erreur de Squaly. Pour expliquer cette erreur il faut bien comprendre la notion de programmation par contrat.
Il y a une rupture du contrat: dans un carré, on a une condition invariante qui est coté = coté. De ce faite un rectangle ne peut évidemment pas dériver d'un carré.
Dans le cas de l'héritage inverse, si l'on choisit l'astuce du setter: setW(u): W=H=u, on a une rupture du contrat qui est lorsque que l'on défini W, h est constant.
Le carré et le rectangle étant divergeant sur la definition de la longueur et de la largeur, ces deux éléments ne peuvent pas être définis dans l'abstraction (hors constructeur).
Pour le deuxième sujet, l'exception est vraiment moche. Et je tenais juste à préciser qu'il ne faut pas mélanger construction et initialisation d'un objet.