Rectangle
,
avec leurs avantages et leurs inconvénients. Le but de cette
réutilisation est de rajouter une classe Carre
.Carre
sera donc une sous-classe de la classe Rectangle
.
Rectangle
, il doit être possible de
définir des hauteurs et largeurs différentes. La méthode Rectangles.doublerRectangle(Rectangle
r)
démontre que cette solution n'est pas correcte :
appliquée à un carré, les dimensions ne seront pas doublées, mais
quadruplées, comme on peut le voir dans la classe Test
.Rectangle
et Carre
factorisent leur code dans une classe abstraite RectangleAbstrait
dont l'usage est limité au paquetage rectangle
. A
noter que cette limitation n'a de sens que si le client n'a pas de
raison de définir ses propres sous-classes de RectangleAbstrait
.
Dans le cas contraire, la limitation de la visibilité de RectangleAbstrait
entraînera une limitation de la ré-utilisabilité du code, ce qui
n'est pas souhaitable. L'inconvénient de cette solution est l'usage
d'une classe supplémentaire (code plus complexe). De plus, utiliser
l'héritage n'est pas toujours possible si l'une des classes (et pas
l'autre) doit déjà hériter d'une autre classe. En effet, l'héritage
multiple est interdit en Java.Carre
délègue à une instance de Rectangle
.
Rectangle
en sous-classes, par exemple Rectangle1
et Rectangle2
,
on pourra dans l'exemple par délégation utiliser ces sous-classes
dans Carre
: il suffit de remplacer l'instruction
delegue = new Rectangle(taille, taille);par, par exemple
delegue = new Rectangle1(taille, taille);
RectangleAbstrait1
,
Carre1
…Pour permettre à un code extérieur de manipuler un objet
Rectangle ou Carre et par exemple demander sa surface ou son
périmètre, sans avoir besoin de savoir si c'est un rectangle ou un
carré, il faut créer une interface commune, par exemple Forme.
Carre
et Rectangle
devront déclarer qu'elles implémentent cette interface.