Il discorso secondo me è che in OOP all'atto pratico non importa definire una tassonomia rigida di classi basata su criteri arbitrari - in questo caso, una classificazione basata sulle lunghezze sul parallelismo dei lati. L'utilità delle classi e dell'ereditarietà si manifesta piuttosto essenzialmente da due punti di vista:
  • implementazione di un'interfaccia - ovvero, i miei tipi possono essere usati da codice che ci lavora sopra in maniera generica, sfruttando le sole funzioni definite nell'interfaccia;
  • riutilizzo del codice delle classi basi - ovvero, la mia classe può riciclare il grosso del codice definito nelle classi base per portare a termine i suoi compiti.


In questo caso, una gerarchia di classi che ricalchi rigidamente la classificazione geometrica non dà alcun vantaggio pratico, perché l'interfaccia che ha senso avere in comune tra le varie figure alla fine è al più quella di un quadrilatero (e solo a livello di metodi getter); in altri termini, per quello che ci importa in OOP un quadrato in genere non è un rettangolo e un rombo, perché riciclare l'interfaccia di un rettangolo o di un rombo per il quadrato ci dà più che altro inutili complicazioni e scarso riutilizzo di codice.