![]() |
Модераторы: bsa |
![]() ![]() ![]() |
|
Tobuk |
|
|||
Новичок Профиль Группа: Участник Сообщений: 29 Регистрация: 20.11.2008 Репутация: нет Всего: нет |
В чем преимущество данного подхода? (с наследованием) Почему бы просто не объявить point1d и point2d ??? Ни как не пойму. |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
Вас интересует наследование в контексте текущего примера ? тут скорей всего, судя по приведенному фрагменту, автор переборщил.. или наследование как таковое ? - тогда Вы нехороший пример выбрали для разбора и анализа.. |
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
Tobuk, наиболее красивые примеры наследования получаются из оконных компонентов. Например, компонент Widget никак не отображается, но при этом у него есть свойства, задающие его размеры и положение. Его наследует компонент Button, который уже имеет собственное изображение и реакцию на клики и пр... Так же его наследует компонент TextEdit, который умеет отображать текст... и так далее
|
|||
|
||||
Tobuk |
|
||||
Новичок Профиль Группа: Участник Сообщений: 29 Регистрация: 20.11.2008 Репутация: нет Всего: нет |
Меня интересует зачем пишут ТАК:
далее
Кроме этих двух классов ничего больше нет. Вот вопрос. Зачем нужен класс A? Это реальный пример из HGE |
||||
|
|||||
Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 27 Всего: 154 |
||||
|
||||
Alca |
|
||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: 2 Всего: 50 |
Чтобы в каждом производном класса могла быть своя реализация ATAATTAA(). |
||||
|
|||||
Tobuk |
|
|||
Новичок Профиль Группа: Участник Сообщений: 29 Регистрация: 20.11.2008 Репутация: нет Всего: нет |
||||
|
||||
Alca |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: 2 Всего: 50 |
http://ru.wikipedia.org/wiki/Интерфейс_(об...ограммирование)
Добавлено @ 18:01
Возможно, на будущее Это сообщение отредактировал(а) Alca - 22.12.2009, 18:02 |
|||
|
||||
baldina |
|
||||||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 15 Всего: 101 |
Есть несколько аспектов, связанных с наследованием.
1. Скорость и качество разработки. Использование наследования уменьшает необходимость повторного кодирования и, вследствие, число возможных ошибок.
В этом классе мы добавляем функционал для работы с цветом. Прочий функционал, общий для всех точек - создание точки, рисование, математика, трансформация и т.д., просто используем. 2. Полиморфизм (в С++ это использование виртуальных функций; неотделимо от наследования) позволяет строить изящные и эффективные архитектурные решения, использующие динамическое определение типа во время исполнения для вызова соответствующего метода (функции). Типичный пример - отображение элементов управления (виджетов):
Этот простой код будет рисовать кнопки, окна, поля ввода и проч., в зависимости от того на какие конкретные объекты указывают указатели в widgets. Для этого метод paint() должен быть объявлен виртуальным в базовом классе. 3. Объектный подход, использующий декомпозицию типов и объектов. Механизм наследования помогает выражать этот подход естественным образом, т.е. встроенными средствами языка. Декомпозиция - важнейший метод инженерии, в т.ч. программной, упрощающий анализ и проектирование и улучшающий качество решения за счет уменьшения связей между компонентами.
Мы раздельно разрабатываем виджет и таймер. таймер ничего не знает про виджет и наоборот. Про интерфейс, абстрактные классы и чистые виртуальные функции. класс, имеющий чистую виртуальную функцию (=0)
называется абстрактным. Например, в примерах выше абстрактным может быть класс Widget:
мы знаем, что все виджеты можно отобразить. но Widget - это общее понятие, нельзя отобразить просто виджет. Можно конкретный - кнопку, окно, поле ввода, картинку... Базовый абстрактный класс говорит, какой интерфейс должны иметь наследники, но не говорит о реализации. Наследники реализуют, каждый по своему. Нельзя создать объект абстрактного класса ("просто Widget"), но можно указатель на абстрактный класс. Тогда будет возможен код из п.2, указатели указывают на конкретные объекты. Добавлено через 7 минут и 26 секунд
Разработчики старались создать расширяемую архитектуру. Что бы при добавлении функционала не переписывать половину заново, а просто добавить необходимое. Есть код, который использует указатель на объект class A. На самом деле указатель указывает на impl_A. Когда решат сделать impl2_A, то код, использующий указатели на А изменять не придется. Его даже перекомпилировать не нужно ![]() |
||||||||||||
|
|||||||||||||
Tobuk |
|
||||
Новичок Профиль Группа: Участник Сообщений: 29 Регистрация: 20.11.2008 Репутация: нет Всего: нет |
baldina
о.О Значит если я определю интерфейсные классы A, B и C. Отнаследую от них несколько нормальных классов с реализацией. Потом создам класс G
То я смогу использовать все красиво так:
Это нормальный подход? |
||||
|
|||||
GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 6 Всего: 26 |
в HGE вообще страшный код, я тоже думаю что динамический полиморфизм там совсем не нужен
|
|||
|
||||
baldina |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 15 Всего: 101 |
не
а
Конечно! Более чем нормальный ![]() Пример:
Это сообщение отредактировал(а) baldina - 22.12.2009, 19:03 |
||||||
|
|||||||
Tobuk |
|
|||
Новичок Профиль Группа: Участник Сообщений: 29 Регистрация: 20.11.2008 Репутация: нет Всего: нет |
baldina
Тогда еще вопрос. Если от класса window отнаследовать классы window_windows и window_linux(один будет всегда в ифндефах некомпилирущийся), то это нормально? Я так однажды сделал. Хорошо получилось(код читаемый без всяких ифндефак в каждой строчке), но мне сказали, что так ни кто не делает и нужно написать все в одном файле и нашпиговать все ифндефами. Я послушался, но получилось месиво, а не код. Какой же вариант правильный? |
|||
|
||||
GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 6 Всего: 26 |
а #ifdef зачем?
как максимум
|
|||
|
||||
baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 15 Всего: 101 |
имхо твой вариант был лучше. гораздее причем
![]() еще можно подключать/отключать на уровне сборки проекта (makefile) Добавлено через 58 секунд
помимо typedef видимо желательно вообще исключить из компиляции ненужный код |
|||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |