qui cadi in contradizione: dato che la natura non ha forme rigide la natura non può pensare niente del quadrato perché non esiste.
Io non la vedo. Se in natura non esistono quadrati, allora il problema quadrato => caso particolare del rettangolo è solo un problema umano. E dato che la geometria è stata inventata dall'uomo, all'uomo fa comodo definire un caso particolare del rettangolo, quadrato.

questo è un problema dell'OOP e non della geometria.
Ma qui si sta parlando di OOP non di geometria. Se per sua natura l'OOP è meno precisa della geometria, si adatta la geometria all'OOP non viceversa.
errato: il parallelogramma è solo un caso speciale di poligono a 4 lati che a sua volta è un caso speciale di poligono che è un caso speciale di poligonale... figura. Inoltre rombo e rettangolo sono un caso speciale di parallelogramma e quadrato un caso speciale di questi ultimi due.
E quindi? Il concetto rimane quello di raffinare il grezzo. Il punto di partenza scelto è tra quelli che ci fa più comodo. Altrimenti dovrei dire che in ultima analisi il quadrato è un caso particolare di punto in movimento. Bello, ma poco pratico
Una soluzione già accennata da MItaly è la ereditarietà multipla.
Se non ricordo male Java ha tolto questa possibilità e nemmeno in C++ che chi ne è entusiasta. Io in C++ userei l'ereditarietà protetta, più che altro per nascondere l'interfaccia del rettangolo e definire la nuova interfaccia solo per il quadrato. Ma si può fare in Java (non lo conosco molto)?
Questa è la soluzione più logica ed è anche il motivo per cui nei linguaggi che adottano principi funzionali non si incorre in questi problemi.
Ce ne saranno altri. Non mancano i problemi, mancano le soluzioni