Модераторы: группа: Модератор, группа: Комодератор

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ООП: Квадрат и прямоугольник. Что отчего наследовать? 
:(
    Опции темы
DeadSoul
Дата 19.5.2006, 00:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1217
Регистрация: 25.9.2005
Где: Москва




Извините, более подходящего раздела не увидел.

Ответ на вопрос ЗНАЮ. Знающие ответ пусть помолчат, а новички попробуют на него ответить.

Дано: нужно реализовать два класса Square(квадрат) и Rectangle(прямоугольник). Понятно, что они очень похожи. Какой класс следует унаследовать от другого(или не нужно наследовать вообще smile  ) ? 


--------------------
 Если Вы получили ответ на Ваш вопрос, то нажмите на "Вопрос решен". 

Бьем спамеров их же оружием. Пусть весь спам сыпется им
[email protected] 
PM   Вверх
Void
Дата 19.5.2006, 00:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich




DeadSoul, тут от одного флейма очухаться не успели, а ты новый затеваешь? smile
Ignat, убери тему от греха подальше! smile 


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
DeadSoul
Дата 19.5.2006, 00:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1217
Регистрация: 25.9.2005
Где: Москва




Void, не понял. При чем тут флейм? К тематике сайта вопрос имеет совсем прямое отношение

И вопрос на самом деле очень хороший. 


--------------------
 Если Вы получили ответ на Ваш вопрос, то нажмите на "Вопрос решен". 

Бьем спамеров их же оружием. Пусть весь спам сыпется им
[email protected] 
PM   Вверх
Void
Дата 19.5.2006, 00:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich




DeadSoul, я вот эту тему имею в виду. Если здесь начнется продолжение, увольте. 


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
maxim1000
Дата 19.5.2006, 00:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев




ответа тут нет
это полностью зависит от контекста задачи
если очень хочется наследовать и при этом получить как можно более общий ответ, то - наследовать от класса "фигура" smile

то, что квадрат является прямоугольником в геометрическом смысле, ещё не значит, что он будет являться ним в той модели, которая будет описана в программе
причина простая - в программе объекты могут меняться, в геометрии и математике вообще величины не меняются
с другой стороны, в большинстве популярных языков, мягко говоря, не принято, чтобы объект менял свой класс

вот и получается, что объект прямоугольник, скорее всего будет иметь методы SetWidth и SetHeight
если квадрат наследовать от прямоугольника, то наличие в нём этих методов будет некорректным (по крайней мере, мне так кажется) - функции, получающие на вход прямоугольник вправе ожидать, что они могут сделать соотношение сторон любым

если прямоугольник наследовать от квадрата... ну не знаю... если функция требует квадрат, то наличие возможности передать туда прямоугольник лично для меня выглядит несколько опасным...

возможно, если работать с константными объектами (как это происходит в математике), т.е. запретить им менять свои параметры, можно было бы наследовать квадрат от прямоугольника... впрочем, это - то, о чём я говорил - зависимость от контекста задачи...

Цитата(DeadSoul @  18.5.2006,  23:13 Найти цитируемый пост)
Извините, более подходящего раздела не увидел.

чем не подходит "Философия программирования"?
как мне кажется, туда можно было бы скинуть и тему, породившую этот вопрос, если бы из неё не устроили религиозную войну...

Добавлено @ 00:39 
например, Майерс (если не ошибаюсь) вообще не советует наследовать что-либо от конкретных классов
часто более удобно выделить то общее, что мы в них видим, в абстрактный класс и наследовать от него... 


--------------------
qqq
PM WWW   Вверх
Quadr0
Дата 19.5.2006, 01:27 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











...

Это сообщение отредактировал(а) Quadr0 - 15.7.2011, 11:15
  Вверх
chipset
Дата 19.5.2006, 01:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4071
Регистрация: 11.1.2003
Где: Seattle, US




А ещё можно сделать шаблон Quad и вводить зависимости между сторонами стратегиями. К примеру:
quad<figures::rectangle> rect;
quad<figures::square> sq;
quad<figures::rhombus> rh;

Где классы figures:: обозначают геометрические правила для сторон.
А ещё можно создать класс polygon и определять там количество вершин и опять-же, зависимости.
polygon<4, figures::square> sq;

Я даже могу предположить проверку совместимости кол-ва сторон с выбранной моделью, используя шаблоны можно такого понатворить!
И хотя это не ООП а АОП и в реальном проекте я вряд-ли такое буду практиковать, теоретически выглядит гламурно smile  


--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
Exception
Дата 19.5.2006, 07:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 4525
Регистрация: 26.12.2004




Либо вообще не определять квадрат (а зачем?), либо определить классы Квадрат и Прямоугольник производными от Четырёхугольника и предоставить в Квадрате метод ToRectangle(), либо попытаться реализовать вариант, предложенный Чипсетом. 
PM   Вверх
skyboy
Дата 19.5.2006, 11:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск




Опять - двадцать пять?  smile Я так понимаю, в этих войнах погибнут только самые зелёные, а бывалые зачинщики только посмеиваться будут... 
В самом деле, у квадрата лучше реализовать свойство "размер", который будет хранить в единственном экземпляре расстояние между двумя связанными вершинами, а прямоугольник уже наследовать от параллелограмма... Впрочем, что общего у квадрата и прямоугольника? Прямой угол между сторонами каждого угла? Так изменение параметров отличается.. Зачем наследовать одно от другого? 
О! Квадрат - от ромба, а прямоугольник - от паралелограмма, все они - от четырёхугольника, который просто хранит положение вершин и производит масштабирование(без нарушения пропорций). 
Т.е.:


                                     /---------- ромб --------------- квадрат
--- четырёхугольник---|
                                     \______ параллелограмм ---------- прямоугольник

 
PM MAIL   Вверх
ivashkanet
Дата 19.5.2006, 11:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь




skyboy, к вашему сведению Ромб --- это параллелограмм 
PM MAIL WWW ICQ   Вверх
Exception
Дата 19.5.2006, 14:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 4525
Регистрация: 26.12.2004




И что? Это не значит, что наследоваться имеет смысл. 
PM   Вверх
DeadSoul
Дата 19.5.2006, 23:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1217
Регистрация: 25.9.2005
Где: Москва




maxim1000 ответил на вопрос правильно. Тут наследовать одщно от другого нельзя. Аналогично нельзя наследовать и все предложенные выше классы.

1. Наследовать прямоугольник от квадрата нельзя. Очевидно.

2. Почему нельзя наследовать квадрат от прямоугольника:
Код

Square* ptr=CreateObject();
ptr->SetHeigth( 10 );
ptr->SetWigth( 20 );
assert( ptr->GetHeight()==10 );

данный код корректен для прямоугольника, но некорректен для квадрата.

Наилучший выход - реализация квадрата через прямоугольник, используя делегирование 


--------------------
 Если Вы получили ответ на Ваш вопрос, то нажмите на "Вопрос решен". 

Бьем спамеров их же оружием. Пусть весь спам сыпется им
[email protected] 
PM   Вверх
Void
Дата 20.5.2006, 01:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich




Цитата(DeadSoul @  20.5.2006,  01:53 Найти цитируемый пост)
Наилучший выход - реализация квадрата через прямоугольник, используя делегирование

Учитывая, что LSP нарушается в данном примере только при наличии изменяющих объект операций, нельзя ли вместо делегирования обойтись такой иерархией?

ImmutableRectangle
Rectangle : ImmutableRectangle
ImmutableSquare : ImmutableRectangle
Square : ImmutableSquare

Несколько надуманно с практической точки зрения, но, с другой стороны, необходимость выделять квадрат в отдельный класс тоже совсем не очевидна. Хотя сам пример (равно как и круг/эллипс, действительное/комплексное число и т.д.) — превосходен. 

Это сообщение отредактировал(а) Void - 20.5.2006, 01:26


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
maxim1000
Дата 20.5.2006, 02:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев




Цитата(DeadSoul @  19.5.2006,  22:53 Найти цитируемый пост)
Почему нельзя наследовать квадрат от прямоугольника

опять же с поправкой, что размеры можно изменять
без возможности изменения размеров квадрат является прямоугольником...

Цитата(DeadSoul @  19.5.2006,  22:53 Найти цитируемый пост)
Наилучший выход - реализация квадрата через прямоугольник, используя делегирование

не в курсе, что такое делегирование... типа наследования  реализации (private в C++)?
тогда не всегда стоит - квадрату нужно меньше данных для описания, чем прямоугольнику, так что получится неоправданая трата времени
но "не стоит" здесь значит, что путь неоптимальный с точки зрения ресурсов, и при их нехватке лучше так не делать...

Цитата(Void @  20.5.2006,  00:22 Найти цитируемый пост)
ImmutableRectangle
Rectangle : ImmutableRectangle
ImmutableSquare : ImmutableRectangle
Square : ImmutableSquare

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


--------------------
qqq
PM WWW   Вверх
chipset
Дата 20.5.2006, 04:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4071
Регистрация: 11.1.2003
Где: Seattle, US




Честно говоря, я бы не наследовал ничего вообще. ООП это хорошо, но читабельность тоже рулит и если придется поступится ООПом то я положу его на алтарь читабельности без малейшего промедления. 


--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Флейм"
Тут модерируют вообще все кому не лень!

Это "Песочница"!!!

В разделе не действуют многие правила:

  • Можно оффтопить
  • Можно флудить, но не увлекаться
  • Можно общаться на темы, не только связанные с программированием.
  • Если вы поставили здесь адекватный вопрос, не ждите адекватного ответа.

Строго запрещено:

  • Размещать рекламу
  • Обсуждать политику
  • Оскорблять друг-друга и переходить на личности
  • Наезжать
  • Материться
  • Уныло обсуждать унылые вещи

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


Глас Винграда:

Лучшее в Камасутре - это введение!


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Все кому не лень.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Песочница | Следующая тема »


 




[ Время генерации скрипта: 0.1001 ]   [ Использовано запросов: 20 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.