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

Поиск:

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


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


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




Цитата

К Вашему сведению ромб - это параллелограм

ivashkanet, да ну?  smile Я и не знал... На самом деле, ситуация у них такая же, как и у квадрата с прямоугольником: паралеллограм в общем виде имеет два размера, по одному для каждой стороны, а для ромба нужна только одна длина. И хранить её тоже в единственном варианте, а не дублировать, как бы пришлоь делать после наследования от параллелограма.  smile 
PM MAIL   Вверх
DeadSoul
Дата 20.5.2006, 12:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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




Цитата(maxim1000 @  20.5.2006,  02:26 Найти цитируемый пост)
не в курсе, что такое делегирование... типа наследования  реализации (private в C++)?

Код

class Square
{
  Rectangle rect_;
};
 


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

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


Эксперт
****


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




Как я уже сказал, либо вообще лучше не наследовать (предоставив метод ToRectangle() у квадрата), либо использовать стратегии, как говорил Чипсет, либо пользовать вариант Войда, который мне тоже нравится. 
PM   Вверх
Се ля ви
Дата 20.5.2006, 15:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java/SOAрхитектор
****


Профиль
Группа: Модератор
Сообщений: 2016
Регистрация: 5.6.2004
Где: place without tim e and space




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

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

Квадрат
|   длина ребра
|
|- Прямоугольник
        длина ребра
        длина ребра2

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

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

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


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

Можно задать в Прямоугольнике методы, которые возвращают оба ребра - первое и второе и в квадрате интерфейс будет тот же самый, но метод, возвращающий второе ребро будет перегружен и реально будет вызывать метод первый, и только первый метод будет возвращать длину первого ребра. Тогда получаем оптимальный компромиcс.

Единственное, что не очень красиво - это всплывающая проблема именования рёбер - их четыре, но реально отличаются из них в прямоугольнике - 2, а в квадрате - вообще только одно уникальное ребро в плане длины, так что если нам нужно установить длину ребра, то нам лучше реализовать методы "верниГоризонтальноеРебро" и "верниВертикальное".

P.S. Впрочем, вся эта модель заметно усложняется, если нам понадобиться создавать всё дерево наследования объектов Планиметрии, а не только эти два, хотя и можно при этом действовать похожим способом.  

Это сообщение отредактировал(а) Се ля ви - 20.5.2006, 15:32


--------------------
  )
 (
[_])
проф. блог

Кролики думали, что занимаются любовью, а на самом деле их просто разводили...
PM MAIL WWW Skype GTalk   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Флейм"
Тут модерируют вообще все кому не лень!

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

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

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

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

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

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


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

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


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

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


 




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


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

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