Все-таки математика права, квадрат это прямоугольник, и в приведенном ниже коде (на Java) нет ничего неприличного:
class Rectangle {
int width, height;
public Rectangle(int width, int height) {
this.width = width;
this.height = height;
}
public int Width() {
return width;
}
public int Height() {
return height;
}
}
class Square extends Rectangle {
public Square(int side) {
super(side, side);
}
}
А если захотелось добавить методы
SetWidth и
SetHeight, так это уже нечто за пределами математических понятий "квадрат" и "прямоугольник". В математике объекты (не в смысле ООП объекты, нет, в обычном, человеческом смысле объекты), так вот, в математике объекты как правило неизменные, то есть умножая одну матрицу на другую получаем третью, а вовсе не модифицируем первую. В программировании такие объекты тоже встречаются, например
String в Java или .NET; и если
Rectangle и
Square определить неизменными, они вполне могут быть связаны отношением наследования.