Sinon la solution qui me semble la meilleure est celle de Kevin également, à l'exception près que j'aurais laissé Square posséder les méthodes "getWidth" et "getHeight" au lieu de les remplacer par "getSideLength" (ça permet d'accéder en lecture à un carré comme à un rectangle sans se poser plus de questions) :
interface Rectangular
{
public int getHeight ();
public int getWidth ();
}
class Rectangle implements Rectangular
{
private int h;
private int w;
public int getHeight () { return this->h; }
public int getWidth () { return this->w; }
public void setHeight (int h) { this->h = h; }
public void setWidth (int w) { this->w = w; }
}
class Square implements Rectangular
{
private int l;
public int getHeight () { return this->l; }
public int getWidth () { return this->l; }
public void setSideLength (int l) { this->l = l; }
}
[edit 1] ah bah c'est quasiment la solution de Brunni en fait, j'avais mal lu, sauf que je préfère ne pas conserver deux variables distinctes dans Square, puisque ça introduit une incohérence possible qu'il est aussi simple d'éviter.
[edit 2] décidément j'ai lu n'importe comment, la solution de Kevin laisse getWidth et getHeight à la classe Square, donc je n'ai rien à reprocher ^^