Задать вопрос

Почему прямоугольник не является экземпляром класса квадрата?

Смотрю вэбинар по ООП, и там говорится про наследование классов на примере квадрата и прямоугольника
Дескать что лучше подходит для прородителя, квадрат или прямоугольник друг-другу
В реальности говорится что нито, ни другое
Потому что предком должен быть четырёхугольник, т.к. якобы площадь одинаково не посчитать у квадрата и прямоугольника
Почему не посчитать, если что у квадрата можно умножить ширину на высоту, что у прямоугольника
Мне кажется что квадрат подходит для предка прямоугольнику по иерархии, а наоборот нет
для ООП объекты что должны быть взаимозаменяемы?

задать_ширину()
задать_высоту()
вычислить_площадь()

ведь одни и теже свойства и методы

может потому что и квадрат и прямоугольник могут быть только объектами класса четырёхугольника?
  • Вопрос задан
  • 1968 просмотров
Подписаться 4 Простой 6 комментариев
Решения вопроса 2
@majstar_Zubr
C++, C#, gamedev
Дело в том, что в объектно ориентированном программировании обобщаются не понятия, а определённый набор функций, которые совокупно описывают/осуществляют модификацию каких-то логически связанных данных.

В реализации графического редактора действительно приходишь к выводу, что квадрат и прямоугольник, с точки зрения данных и функционала абсолютно разные - почти все функции, которые не относятся ко всем четерёхугольникам, имеют разные сигнатуры. А все потому, что у квадрата лишь одна сторона. Например, площадь - для метода рассчёта площади квадрата нужен один параметр, а для прямоугольника - два.

С точки зрения ООП, наследование - это перенятие функциональности, но в случае с прямоугольником и квадратом перенятия функциональности нет, потому что площадь прямоугольника по одной стороне нельзя посчитать, а у квадрата нет второй стороны.

Ромб от квадрата отличается тем, что у квадрат задаётся 1 углом, а ромб двумя.

Эллипс от окружности тоже отличается сильно, просто окружность в графическом представлении есть частный случай определенной конфигурации данных, которые описывают эллипс. Но. Графическое представление - это уже за пределами ООП.

ООП - инструмент для программирования в первую очередь, все сущности представляются относительно минимально необходимого обобщения поведения.

Для площадей, для отрисовки диагоналей и прочих многих функций у квадрата и прямоугольника будут разные сигнатуры и в принципе разные поля, что значит, это разные классы.

Единственное что у них общее - они оба выпуклые прямоугольники, их можно вписать в окружность. Но если вы не собираетесь реализовывать для своего графического редактора поворот, вписывание в окружность, то не будет у вас причин вводить класс для выпуклых четерёхугольников в принципе.
Ответ написан
Комментировать
@ProkletyiPirat
ПМСМ авторы привели ЖУТКО НЕПРАВИЛЬНЫЙ пример ООП
Смотрите
1)квадрат,
1.1)имеет переменную A="длина сторон"
1.2)Имеет функцию площади F=(A^2)

2)прямоугольник
2.1)имеет переменную A="длина"
2.2)имеет переменную B="ширина"
2.3)Имеет функцию площади F=(A*B)

3)четырёхугольник
3.1)имеет переменную A="длина стороны 1"
3.2)имеет переменную B="длина стороны 2"
3.3)имеет переменную C="длина стороны 3"
3.4)имеет переменную D="длина стороны 4"
3.5)имеет угол Q="угол между сторонами 1 и 2"
3.6)имеет угол W="угол между сторонами 2 и 3"
3.7)имеет угол E="угол между сторонами 3 и 4"
3.8)имеет угол R="угол между сторонами 4 и 1"
3.9)функция высчитывания площади самопересекающегося четырёхугольника(точнее функция высчитывающая площадь с учётом того что четырёхугольник может быть самопересекающимся)

А вот теперь ВНИМАНИЕ: В каждом из этих объектов есть что-то что не нужно(излишне) другим объектам, ПОТОМУ данные объекты(классы) не могут быть "наследуемыми" друг от друга.

А как правильно?
А правильно сделать "интерфейс"("интерфейс" - это название шаблона(паттерна) проектирования) под названием "объект имеющий площадь" в котором объявить функцию "получить площадь" и сделать 2\3\4\N классов которые будут наследовать данный интерфейс и реализовывать данную функцию.

p.s.Вообще мне в понимании ООП и того "нахрена это нужно" очень сильно помогли статьи на тему паттернов проектирования, и лично я считаю что одно без другого преподавать нельзя.
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
robinzonejob
@robinzonejob
разработчик .NET
Я думаю, имелось в виду то, что прямоугольник более широкое понятие, чем квадрат.
Ответ написан
profesor08
@profesor08
Квадрат это частный случай прямоугольника. Точка. Можно забыть слово квадрат и говорить всегда прямоугольник, смысл не изменится. Для создания квадрата требуется лишь один параметр, длинна грани. Для создания прямоугольника требуется два параметра, длина грани А и грани Б. Задав прямоугольнику два одинаковых параметра, получится квадрат. Если есть уже прямоугольник, то для него можно сделать обертку в виде квадрата с одним параметром и создавать прямоугольники, и не надо писать лишнее.

class Figure {
  constructor(edges: number[], angles: number[]) {
    //  ...
  }
}

class Rectangle extends Figure {
  constructor(x: number, y: number) {
    super([x, y, x, y], [90, 90, 90, 90]);
  }
}

class Square extends Rectangle {
  constructor(x: number) {
    super(x, x);
  }
}
Ответ написан
@ilya-rachinskiy
В Вашем примере нарушается один из принципов SOLID (Принцип подстановки Барбары Лисков).
Вот здесь материал, в котором разбирается Ваш пример.
Также там можно в целом получить много информации и по остальным принципам.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы