Дело в том, что в объектно ориентированном программировании обобщаются не понятия, а определённый набор функций, которые совокупно описывают/осуществляют модификацию каких-то логически связанных данных.
В реализации графического редактора действительно приходишь к выводу, что квадрат и прямоугольник, с точки зрения данных и функционала абсолютно разные - почти все функции, которые не относятся ко всем четерёхугольникам, имеют разные сигнатуры. А все потому, что у квадрата лишь одна сторона. Например, площадь - для метода рассчёта площади квадрата нужен один параметр, а для прямоугольника - два.
С точки зрения ООП, наследование - это перенятие функциональности, но в случае с прямоугольником и квадратом перенятия функциональности нет, потому что площадь прямоугольника по одной стороне нельзя посчитать, а у квадрата нет второй стороны.
Ромб от квадрата отличается тем, что у квадрат задаётся 1 углом, а ромб двумя.
Эллипс от окружности тоже отличается сильно, просто окружность в графическом представлении есть частный случай определенной конфигурации данных, которые описывают эллипс. Но. Графическое представление - это уже за пределами ООП.
ООП - инструмент для программирования в первую очередь, все сущности представляются относительно минимально необходимого обобщения поведения.
Для площадей, для отрисовки диагоналей и прочих многих функций у квадрата и прямоугольника будут разные сигнатуры и в принципе разные поля, что значит, это разные классы.
Единственное что у них общее - они оба выпуклые прямоугольники, их можно вписать в окружность. Но если вы не собираетесь реализовывать для своего графического редактора поворот, вписывание в окружность, то не будет у вас причин вводить класс для выпуклых четерёхугольников в принципе.