![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#11 | |
Старожил
Регистрация: 16.12.2011
Сообщений: 2,329
|
![]() Цитата:
Например: Код:
Однако же он от него унаследован. Ему нужен был функционал сервисов. Это довольно распространенный способ подключать к классу различные службы: struct Agent: boost::noncopyable //запрет на копирование { ... }; struct Agent: protected EventSystem //подключение к системе сообщений { ... }; struct Agent: IFace1,IFace2 //интерфейсные контракты { ... }; struct Agent: Mechanism //модификация механизма { ... }; Я уже молчу про обобщенное программирование, и метапрограммирование, где могут целые архитектуры разворачиваться в зависимости от параметров шаблона. Всякие там паттерны "цепочка", когда на шаблонах генерируется линейка наследования по различным криетриям, и тп вещи. Теперь представь себе: у тебя есть куча классов по проекту: всякие картинки, кнопки, анимации и тп. Все они обязаны иметь дизайн вида: Картинка.УстановитьХУ(арг); Кнопка.УстановитьХУ(арг); Анимация.УстановитьХУ(арг); И везде за это отвечает одна и та же механика. Лично я сделаю один единственный класс-сеттер/геттер, и его реализацию унаследую для каждого нужного мне агента. А что сделаешь ты? Будешь копипастить реализацию каждый раз заново? Последний раз редактировалось _Bers; 08.05.2013 в 16:35. |
|
![]() |
![]() |
![]() |
#12 | |
Регистрация: 06.05.2013
Сообщений: 7
|
![]() Цитата:
|
|
![]() |
![]() |
![]() |
#13 | ||||
Санитар
Старожил
Регистрация: 04.10.2008
Сообщений: 2,577
|
![]() Цитата:
Цитата:
Цитата:
Цитата:
Но, вцелом, мне кажеца я понял что ты имел ввиду, что редко объекты моделируют какие-то предметы, которые легко представить (тот же boost::noncopyable из твоих примеров), и поэтому все эти книжные штуки притягиваюца за уши. Если мысль угадал верно, то согласен ![]() |
||||
![]() |
![]() |
![]() |
#14 | |
Старожил
Регистрация: 16.12.2011
Сообщений: 2,329
|
![]() Цитата:
То есть наследование можно и нужно использовать тогда, когда требуется и возможно получить конечный класс нужного функционала, без копипасты на базе уже имеющихся классов. Зачастую базовые классы являются лишь источником функционала, либо носят служебно-вспомогательный характер (например, boost::noncopyable или EventSystem) То есть, в принципе не предполагаются функции типа: Код:
... Что до самого многоугольника: лично я не вижу ни одной причины, зачем вообще ему мог бы понадобится функционал точки. Но если бы он действительно понадобился (допустим, по задаче нужно было бы реализовать для много угольника возможность задавать якорь, и вращать многоугольник вокруг его оси) то можно было бы использовать конструкцию вида: Код:
Если мне не изменяет память: именно Саттер в своей книге писал, что не до конца понимает смысла защищенного наследования. Это потому, что данный вид наследования нарушает его концепцию о наследовании. Такой вид наследования явно подчеркивает идею программиста: многоугольник унаследовал весь функционал точки, его данные и его методы, но при этом точкой он не является. Таким образом, вы в принципе не сможете использовать многоугольник в функциях, которые принимают точку: void Foo(const Point& point) { .... } ... CTetragon tetragon; Foo(tetragon); //error: 'Point' is an inaccessible base of 'CTetragon' Ошибка будет времени компиляции. Можно конечно унаследоваться от boost::noncopyable, и назвать потомка частным случаем некопируемого класса. Но это не более, чем буквоедство. На практике не важно, как это называется, а важно, как это работает. Унаследоваться можно всегда, если это удобнее, быстрее, и экономит время на отладке. Примерно тоже самое, только назову базовый класс примерно "Графический объект" или "объект плоскости"/"объект экрана" (судя по УстановитьХУ они будут схожи тока в том, что их можно двигать по плоскости). И скажу, что и кнопка, и картинка и график и окошко - объекты плоскости, т.е. частные случаи, или в терминологии Саттера "картинка является объектом плоскости". Вопрос не в том, как это можно назвать, а в том, как это можно реализовать. Если у них у всех реализация метода SetXY идентичная, и она идентична методам примитива Point, то нет ни одной причины в каждом новом классе заново её копипастить. В том числе, нет ни одной причины, копипастить реализацию в интерфейс: Код:
Последний раз редактировалось _Bers; 08.05.2013 в 19:56. |
|
![]() |
![]() |
![]() |
#15 | ||
Санитар
Старожил
Регистрация: 04.10.2008
Сообщений: 2,577
|
![]() Цитата:
Цитата:
---- добавил: а если приспичит выводить на экран точку, то можно будет вспомнить, что она и есть графический объек, дописать class Point: public GraphicObj{...}; Но МБ не прав, подскажи в чем? |
||
![]() |
![]() |
![]() |
#16 | ||
Старожил
Регистрация: 16.12.2011
Сообщений: 2,329
|
![]() Цитата:
![]() Мы создаём некоторого наследника, наследуясь от уже существующей Точки, что бы для наследника поменьше писать, и поменьше отлаживать. На самом деле, нельзя засунуть готовую реализацию чевотов не скопипастив её (ну или не набрав её заново). Можно конечно выбросить точку из иерархии наследования, и скопипастить её код в интерфейс. И для простых ситуаций это даже предпочтительнее, потому что весь функционал перед глазами, а не размазан по кучке мелких классов. Так удобнее потом будет читать код. Но если это целая служба, имеющая кучу всяких заморочек, Если даже простейшее SetXY на самом деле выполняет кучу всякой всячины (проверка логических координат с учетом реальных размеров окна и виртуального масштаба и бла бла бла) и все уже отлажено и протестировано, то копипаста здесь не добавит никаких удобств, а только сожрет время на новую отладку и тесты. Цитата:
Такую точку правильнее было бы назвать "логическим объектом", а не "графическим". Код:
А вот графическая точка - грубо говоря, это просто цвет пикселя. Например: точку можно нарисовать поверх картинки. Просто перекрасить один из её пикселей. Если же мне вдруг позарез понадобится точка в виде отдельного самостоятельного объекта, который можно перемещать по экрану, и работать с ним, как и с любым другим графическим объектом, то я сделаю себе картинку размером 1 на 1 пиксель, нужного мне цвета. И буду работать с такой точкой как с любой картинкой. Тоже самое касается линий: это просто прозрачная картинка, на которую нанесена линия. Но я не стал бы плодить ещё дополнительные новые графические объекты, чей фунционал итак уже полностью реализован теми же картинками. О то Оккама заругает ![]() |
||
![]() |
![]() |
![]() |
#17 | ||
Санитар
Старожил
Регистрация: 04.10.2008
Сообщений: 2,577
|
![]() Цитата:
Цитата:
|
||
![]() |
![]() |
![]() |
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Метод перебора, Метод дихотомии, Метод золотого сечения Delphi !!! | OneBri | Помощь студентам | 0 | 03.10.2012 08:42 |
Конструктор,метод вывода на экран Display, метод для преобразования в строку toString в Delphi | Чумак Татьяна | Помощь студентам | 6 | 03.04.2012 11:58 |
исследовать метод квадратных корней и метод Холецкого для решения СЛАУ | Vит@x@ | Помощь студентам | 0 | 22.11.2011 10:47 |
Задача Коммивояжера. Метод Монте-Карло и метод приращений. [Паскаль] | U9110 | Помощь студентам | 4 | 06.04.2011 09:48 |
Turbo Pascal[програмыки : текстовая\метод симпсона\метод половинного деления | qsccsq | Помощь студентам | 7 | 24.12.2010 05:23 |