Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 41, средняя оценка - 4.95
el_gato_de_Ch
35 / 35 / 1
Регистрация: 28.04.2013
Сообщений: 110
#1

Понятия инкапсуляции, полиморфизма и наследования - C++

31.01.2014, 21:46. Просмотров 5702. Ответов 42
Метки нет (Все метки)

Всем привет. Прошу прояснить для себя 3 основных свойства парадигмы ООП инкапсуляцию, наследования и полиморфизм. Я напишу своё видение и живой пример, как эта парадигма притворена в жизнь, хочу знать правильны ли мои суждения или нет.

Инкапсуляция - это скрытие реализации.
Пример из реальной жизни: У нас есть объект - домашний стационарный телефон, у которого есть функция "позвонить(номер телефона)" пользователю, не обязательно знать, как коммутируются каналы, как "летают" электроны внутри, он пользуется готовой функцией.
Пример из программирования: private поля класса.

Наследование - возможность объекта иметь потомков, которые имеют расширенный интерфейс.
Пример: Класс - домашний телефон, класс наследник - мобильный телефон с функцией позвонить, и отправить СМС.

Полиморфизм - присваивание действию одного имени разным объектам в иерархии, чтобы потом каждый объект пользовался этим действием, так как угодно именно ему.
Пример из жизни: Расход бензина у различных автомобилей будет рассчитываться по разному в зависимости от количества электроники, которой напичкана машина. (полиморфизм методов).
Телефон стационарный кнопочный, телефон мобильный сенсорный, поля циферблат будут иметь разные типы в первом случае - МатрицаКнопок, во втором случае - СенсорнаяКлавиатура. (Полиморфизм полей класса)

Пример из программирования: перегрузка функций (методов класса наследника), одни и те же поля класса наследника могут иметь различный тип.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Anton_Kretov
89 / 51 / 7
Регистрация: 26.06.2013
Сообщений: 179
31.01.2014, 23:43     Понятия инкапсуляции, полиморфизма и наследования #2
Про инкапсуляцию согласен, с наследованием не совсем. Пример не совсем корректен. Было бы лучше так:
Суперкласс: телефон
Наследники: домашний телефон, сотовый телефон
Kuzia domovenok
1887 / 1742 / 117
Регистрация: 25.03.2012
Сообщений: 5,916
Записей в блоге: 1
01.02.2014, 01:25     Понятия инкапсуляции, полиморфизма и наследования #3
Пытаться проводить параллели ООП с объектами из жизни - довольно бесполезное занятие.
В программировании всякие фишки ООП используются для обеспечения пресловутых гибкости, расширяемости приложения, меньшей зависимости частей большой программы друг от друга, для более удобного разбиения приложения на подсистемы, для удобной работы в команде...
Много для чего, короче. Если коротко, то для упрощения создания программ (преимущественно больших).
И далеко не всегда возможно (да и не нужно) привязывать создаваемые объекты к каким-то реальным предметам нашего мира. Ну попробуй-ка привяжи к ним что-нибудь из некоторых паттернов, например! (Какой-нибудь абстрактный "контроллер" или там "декоратор", "стратегию" или какой-то "менеджер ресурсов") а?
el_gato_de_Ch
35 / 35 / 1
Регистрация: 28.04.2013
Сообщений: 110
01.02.2014, 01:44  [ТС]     Понятия инкапсуляции, полиморфизма и наследования #4
я пытаюсь проводить аналогии, чтобы понять как это устроено =) паттерны - это паттерны сказал бы кэп, это шаблонные методы решения каких-либо задач (в моём понимании), а ООП - это парадигма, оно взялось из-за того что люди попытались связать данные друг с другом не в виде объектов, потому что так мы воспринимаем окружающий мир (опять же имхо), а если так, то почему не провести аналогию, тем более это просто для того чтобы у себя уложилось лучше в голове. Я могу ошибаться в своих суждениях, поэтому и решил создать этот топик, чтобы у более опытных людей узнать.
abit
260 / 259 / 33
Регистрация: 03.02.2013
Сообщений: 709
01.02.2014, 02:49     Понятия инкапсуляции, полиморфизма и наследования #5
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Пытаться проводить параллели ООП с объектами из жизни - довольно бесполезное занятие.
если так - то тогда вообще ООП не имеет смысла по большому счёту, учите haskell, во имя добра)
ООП так и задумана, чтобы была абстракция, инкапсуляция, наследование, полиморфизм, в общем всё то, что мы наблюдаем за окном, а не в экране монитора листинга ассемблера/Си

Добавлено через 9 минут
Цитата Сообщение от el_gato_de_Ch Посмотреть сообщение
я пытаюсь проводить аналогии, чтобы понять как это устроено =) паттерны - это паттерны сказал бы кэп, это шаблонные методы решения каких-либо задач (в моём понимании), а ООП - это парадигма, оно взялось из-за того что люди попытались связать данные друг с другом не в виде объектов, потому что так мы воспринимаем окружающий мир (опять же имхо), а если так, то почему не провести аналогию, тем более это просто для того чтобы у себя уложилось лучше в голове. Я могу ошибаться в своих суждениях, поэтому и решил создать этот топик, чтобы у более опытных людей узнать.
про паттерны не думай на начальных аналогиях,
давай про киты ООП:
Инкапсуляция - фактически ты реализуешь свой класс из интерфейса, по которому могут общаться его объекты и внутреннии части кода класса, которую и называют Инкапсуляция, т.е. к ней объекты класса напрямую не обращаются, пример : std::vector, ты можешь добавлять-удалять элементы, но напрямую size изменить не можешь, потом

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

Полиморфизм - не путайте с перезагрузкой функций и т.д., реального полиморфизма в С++ я не видел
Kuzia domovenok
1887 / 1742 / 117
Регистрация: 25.03.2012
Сообщений: 5,916
Записей в блоге: 1
01.02.2014, 03:20     Понятия инкапсуляции, полиморфизма и наследования #6
Цитата Сообщение от abit Посмотреть сообщение
если так - то тогда вообще ООП не имеет смысла по большому счёту, учите haskell, во имя добра)
ООП так и задумана, чтобы была абстракция, инкапсуляция, наследование, полиморфизм, в общем всё то, что мы наблюдаем за окном, а не в экране монитора листинга ассемблера/Си
нет, это именно так. Иначе чем тебе Си не угодил? В нём есть замечательные struct! Описывай своё 'заокном' сколько хочешь! Кстати, за окном я никакого ооп не наблюдаю. Абстракций никаких, все предметы конкретны, никаких реализаций не сокрыто, полиморфизма нет, всё гораздо более "неабстрактно", т.е. конкретно, чем любой язык может выразить от асма до самих си и хаскела.
Есть ли вообще хоть что-то абстрактное в реальном мире, кроме картин супрематистов?

Добавлено через 9 минут
abit, пока ты называешь наследование "старым приёмом, который раньше назывался агрегированием", тебе лучше воздержаться отвечать на вопросы о наследовании!
gray_fox
What a waste!
1253 / 1136 / 54
Регистрация: 21.04.2012
Сообщений: 2,359
Завершенные тесты: 3
01.02.2014, 04:40     Понятия инкапсуляции, полиморфизма и наследования #7
Цитата Сообщение от abit Посмотреть сообщение
если так - то тогда вообще ООП не имеет смысла по большому счёту, учите haskell, во имя добра)
ИМО, всё таки на понятия "реального мира" ООП не стоит так прямо отображать, если только для упрощения понимания... Мы же не наследуем класс квадрата от класса прямоугольника, правда?)
rrrFer
Заблокирован
01.02.2014, 10:15     Понятия инкапсуляции, полиморфизма и наследования #8
Цитата Сообщение от gray_fox Посмотреть сообщение
ИМО, всё таки на понятия "реального мира" ООП не стоит так прямо отображать, если только для упрощения понимания... Мы же не наследуем класс квадрата от класса прямоугольника, правда?)
Похожие примеры есть в какой-то классической книжке по ООП. Пример в книжке был следующего вида - окружность и точка. Математически - окружность - множество точек, равноудаленных от заданной. Даже в этом тривиальном случае ООП не позволяет нам описать объекты "по определению", а с не математическими объектами все еще сложнее. Все в той же классической книге шли долгие размышления, что лучше - описать окружность как "точку с радиусом" или описать точку как окружность нулевого радиуса.

Про правильное наследование можно у Саттера почитать - он описывает виды отношений, которые может выражать наследование и раскладывает все по полочкам.

Дак вот квадрат является прямоугольником, стороны которого имеют равную длину. Мне кажется, Саттер одобрил бы наследование. (см. правило 37 у Саттера).

Цитата Сообщение от abit Посмотреть сообщение
Наследование - если честно это старый приём, который раньше назывался агрегирование
Можно почитать Саттера на этот счет. У него там есть описание случаев, в которых агрегирование не даст результата.

Добавлено через 7 минут
Вцелом, все размыто более чем. ООП бывает разным. Вот есть ряд заморских товарищей, которые считают, что в SWI Prolog есть ООП и находят все основания для этого. Так, по их мнению, объект - это экземпляр подключенного модуля. Модуль - класс. Инкапсуляция - модуль предоставляет открытый интерфейс в SWI, все что к нему не относится - закрыто. У модуля (читай объекта) есть состояние - локальная база данных. Модули можно иерархически включать друг в друга, перегружать что-то и т.п. Это коротко, более подробно можно загуглить.
Вобщем, за уши можно притянуть что угодно и куда угодно. Но зачем?
Иное ООП и в смолтолке или Objective-C.
aLarman
640 / 561 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
01.02.2014, 12:42     Понятия инкапсуляции, полиморфизма и наследования #9
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Ну попробуй-ка привяжи к ним что-нибудь из некоторых паттернов, например!
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
"декоратор", "стратегию"
Читаю книгу по паттернам, там все паттерны привязаны к реальным объектам, в частности декоратор стратегия, и .др
Kuzia domovenok
1887 / 1742 / 117
Регистрация: 25.03.2012
Сообщений: 5,916
Записей в блоге: 1
01.02.2014, 13:12     Понятия инкапсуляции, полиморфизма и наследования #10
aLarman, притянуто за уши. В реале никаких "стратегий" не бывает. Что я хотел сказать, так это: если программисту нужен некоторый интерфейс для его объектов, он смело создаёт абстрактный класс и наследуется от него. Никаких аналогов в реале он не ждёт. Нужен ему какой-то абстрактный inputReader - пожалуйста!

Тут есть и ещё один момент, кстати. Если поставить цель найти реальные аналоги к созданным классам, ты их может и найдёшь... ну притянешь за уши, на крайняк. А вот создавать классы на основе реальн. предметов даже не надо пытаться! В итоге выяснится что для такого подхода нет разницы между наследованием и агрегацией(см. выше), появится наследование треугольника от точки, бмп от танка... и.т.п. казусы.
aLarman
01.02.2014, 13:14
  #11

Не по теме:

Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
притянуто за уши
хотя да....но все же с целью помочь разобратся в модели на основе реальных предметов...

Avazart
7044 / 5221 / 259
Регистрация: 10.12.2010
Сообщений: 22,945
Записей в блоге: 17
01.02.2014, 14:28     Понятия инкапсуляции, полиморфизма и наследования #12
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Ну попробуй-ка привяжи к ним что-нибудь из некоторых паттернов, например! (Какой-нибудь абстрактный "контроллер" или там "декоратор", "стратегию" или какой-то "менеджер ресурсов") а?
Ага а откуда взялись эти названия паттернов? не с реально жизни ?

Русский, английский языки, то же не идеально описывают Мир и чЁ?

Добавлено через 6 минут
Цитата Сообщение от abit Посмотреть сообщение
Полиморфизм - не путайте с перезагрузкой функций и т.д., реального полиморфизма в С++ я не видел
А какой есть, нереальный ?

Добавлено через 6 минут
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
! В итоге выяснится что для такого подхода нет разницы между наследованием и агрегацией(см. выше),
А что есть ?
Это лишь приемы, для описания того что нужно...
Собственно как и литературные приемы применяемые писателем что бы выразить свои мысли и ощущения "под действием этого мира".

Добавлено через 10 минут
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
появится наследование треугольника от точки, бмп от танка... и.т.п. казусы.
Треугольник не являться точкой, поэтому тут изначально наследование идет боком.
Зато треугольник может состоять из точек. (может быть описан)
БМП и Танк могут иметь общий базовый класс, что тут нелогичного?
Это лишь примеры не правильного понимания принципов ООП.

Добавлено через 18 минут
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Что я хотел сказать, так это: если программисту нужен некоторый интерфейс для его объектов, он смело создаёт абстрактный класс и наследуется от него. Никаких аналогов в реале он не ждёт.
Вообще то ждет, и чем ближе тем лучше, машина не нуждается в объектном представлении, аналогах, ассоциациях, в них нуждается человек так лучше работает и запоминает его мозг. В данном случае другой программист который будет смотреть твой код.
Dmitriy_M
1334 / 1215 / 110
Регистрация: 20.03.2009
Сообщений: 4,339
Записей в блоге: 11
01.02.2014, 14:43     Понятия инкапсуляции, полиморфизма и наследования #13
Цитата Сообщение от abit Посмотреть сообщение
Полиморфизм - не путайте с перезагрузкой функций и т.д., реального полиморфизма в С++ я не видел
Перегрузка функции это полиморфизм в чистом виде, точно так же как и шаблоны.

Добавлено через 1 минуту
Цитата Сообщение от Avazart Посмотреть сообщение
них нуждается человек так лучше работает и запоминает его мозг.
в топку. всегда можно посмотреть в документацию.
Avazart
7044 / 5221 / 259
Регистрация: 10.12.2010
Сообщений: 22,945
Записей в блоге: 17
01.02.2014, 16:46     Понятия инкапсуляции, полиморфизма и наследования #14
Цитата Сообщение от Dmitriy_M Посмотреть сообщение
в топку. всегда можно посмотреть в документацию.
С 1001 страницей ? зачем ?
Другое дело что не всегда можно провести эту аналогию, без ущерба в реализации.

Добавлено через 1 час 59 минут
Цитата Сообщение от rrrFer Посмотреть сообщение
Дак вот квадрат является прямоугольником, стороны которого имеют равную длину. Мне кажется, Саттер одобрил бы наследование. (см. правило 37 у Саттера).
Может у Мейерса ? У него вроде есть об этом и у него "правила", а у Саттера вроде в "задачах" все.
korvin_
1399 / 1170 / 174
Регистрация: 28.04.2012
Сообщений: 4,235
01.02.2014, 17:31     Понятия инкапсуляции, полиморфизма и наследования #15
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
полиморфизма нет
Ну как же, ты можешь бросить камень или гранату, например, т.е. твое действие «бросок» полиморфно относительно предмета броска. =)

Цитата Сообщение от rrrFer Посмотреть сообщение
Дак вот квадрат является прямоугольником, стороны которого имеют равную длину. Мне кажется, Саттер одобрил бы наследование. (см. правило 37 у Саттера).
http://citforum.ru/programming/digest/lspv/

Цитата Сообщение от Avazart Посмотреть сообщение
Ага а откуда взялись эти названия паттернов? не с реально жизни ?
С какого объекта реальной жизни взялись названия паттернов «Абстрактная фабрика», «Итератор»?

Цитата Сообщение от abit Посмотреть сообщение
Полиморфизм - не путайте с перезагрузкой функций и т.д.
Перегрузка — это такой вид ситуативного (ad-hoc) полиморфизма.

Цитата Сообщение от abit Посмотреть сообщение
реального полиморфизма в С++ я не видел
И каков он «реальный полиморфизм»?
Avazart
7044 / 5221 / 259
Регистрация: 10.12.2010
Сообщений: 22,945
Записей в блоге: 17
01.02.2014, 17:38     Понятия инкапсуляции, полиморфизма и наследования #16

Не по теме:

Цитата Сообщение от rrrFer Посмотреть сообщение
Дак вот квадрат является прямоугольником, стороны которого имеют равную длину. Мне кажется, Саттер одобрил бы наследование. (см. правило 37 у Саттера).



Нашел: Мейерс С. -"Эффективное использование C++. 55 верных способов улучшить структуру и код ваших программ(2006)"
Правило 32. стр 157,158

Но теперь перед нами встает проблема. Как примирить следующие утверждения?
□ Перед вызовом makeBigger высота s равна ширине.
□ Внутри makeBigger ширина s изменяется, а высота - нет.
□ После возврата из makeBigger высота s снова равна ширине (отметим, что s передается по ссылке, поэтому makeBigger модифицирует именно s, а не его копию).

Так что же?

Добро пожаловать в удивительный мир открытого наследования, где интуиция, приобретенная вами в других областях знания, включая математику, иногда оказывается плохим помощником. Основная трудность в данном случае заключается в том, что некоторые утверждения, справедливые для прямоугольника (его ширина может быть изменена независимо от высоты), не выполняются для квадрата (его ширина и высота должны быть одинаковы). Но открытое наследование предполагает, что все, что применимо к объектам базового класса, - все! -также применимо и к объектам производных классов. В ситуации с прямоугольниками и квадратами (а также в аналогичных случаях, включая множества и списки из правила 38), утверждение этого условия не выполняется, поэтому использование открытого наследования для моделирования здесь некорректно.


Добавлено через 3 минуты
Цитата Сообщение от korvin_ Посмотреть сообщение
С какого объекта реальной жизни взялись названия паттернов «Абстрактная фабрика», «Итератор»?
А что с фабрикой не то ? Фабрика производит продукцию разных типов, чем не соответствие ?
KOPOJI
Модератор
Эксперт PHP
16651 / 6592 / 420
Регистрация: 12.06.2012
Сообщений: 19,793
Завершенные тесты: 1
01.02.2014, 17:52     Понятия инкапсуляции, полиморфизма и наследования #17
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
никаких реализаций не сокрыто
Т.е., вы всегда знаете, из чего состоят все вещества вокруг, машина у вас - полностью прозрачная (также, как и квартира) - ведь ничего же не скрыто?
Я не спорю, не всегда легко найти аналогию - но это не всегда значит, что ее нет.
rrrFer
Заблокирован
01.02.2014, 18:34     Понятия инкапсуляции, полиморфизма и наследования #18
Цитата Сообщение от Avazart Посмотреть сообщение
Может у Мейерса ? У него вроде есть об этом и у него "правила", а у Саттера вроде в "задачах" все.
Может и у Мейерса, но я Саттера читал.
Открытое наследование в соответствии с принципом подстановки Лисков (Liskov Substitution Principle [Liskov88]) всегда должно моделировать отношение "является" ("работает как"): все контракты базового класса должны быть выполнены, для чего все перекрытия виртуальных функций-членов не должны требовать большего или обещать меньше, чем их базовые версии. Код, использующий указатель или ссылку на Base, должен корректно вести себя в случае, когда указатель или ссылка указывают на объект Derived.
Цитата Сообщение от korvin_ Посмотреть сообщение
http://citforum.ru/programming/digest/lspv/
Спасибо за ссылку, там как раз пример с квадратом и прямоугольником. Весь текст я не осилил, но понял, что автор пытается доказать, что именно в случае наследования квадрата от прямоугольника правило подстановки нарушается. Посмотрел его аргументы (без контекста) - не убедился. Да и сам автор пишет:
Можно было бы возразить автору, что принцип подстановки плохо сформулирован, что не определен термин замена (хотя в данном примере все понятно: в программу передается ссылка на объект подкласса), что непонятен термин поведение программы и так далее.
Суть в том, что пример взят простой. С точкой и окружностью сложнее. Для этих случаев все разобрано по полочкам, но даже так нет единого мнения и холивары продолжаются.

Цитата Сообщение от Avazart Посмотреть сообщение
Основная трудность в данном случае заключается в том, что некоторые утверждения, справедливые для прямоугольника (его ширина может быть изменена независимо от высоты), не выполняются для квадрата (его ширина и высота должны быть одинаковы).
Но открытое наследование предполагает, что все, что применимо к объектам базового класса, - все! -также применимо и к объектам производных классов. В ситуации с прямоугольниками и квадратами (а также в аналогичных случаях, включая множества и списки из правила 38), утверждение этого условия не выполняется, поэтому использование открытого наследования для моделирования здесь некорректно
Если прочитать все внимательно, а не только выделенный вывод в конце - то можно заменить, что все не так гладко.
Это очень коротко изложенное содержание статьи по ссылке korvin_-а .
Источник холиваров в том, что математика вообще не определяет никаких операций над прямоугольником. Автор этого текста почему-то решил, что надо изменять его высоту, независимо от ширины. У меня есть сомнения. Мало того, квадрат может предоставлять такой же интерфейс, а ("контракт" у Саттера) значит, принцип подстановки сработает. Но в реализации методов будет фича - при изменении ширины будет изменяться высота. Почему-то в этом случае такая фича всех пугает, но в более сложных примерах, возникающих в практике постоянно - нет.
ValeryS
Модератор
6483 / 4949 / 455
Регистрация: 14.02.2011
Сообщений: 16,394
01.02.2014, 18:50     Понятия инкапсуляции, полиморфизма и наследования #19
Цитата Сообщение от rrrFer Посмотреть сообщение
Математически - окружность - множество точек, равноудаленных от заданной.
а давай по другому
точка есть окружность с нулевым радиусом

Цитата Сообщение от gray_fox Посмотреть сообщение
Мы же не наследуем класс квадрата от класса прямоугольника, правда?
а почему бы и нет
квадрат частный случай прямоугольника
прямоугольник частный случай параллелограмма
параллелограмм частный случай четырехугольника

это я к тому что проектирования наследования не так просто как кажется на первый взгляд
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.02.2014, 19:03     Понятия инкапсуляции, полиморфизма и наследования
Еще ссылки по теме:

Виды полиморфизма C++ C++
Задания о наследовании, инкапсуляции и полиморфизма на C#/ нужно как можно быстро C++
C++ Нарушение инкапсуляции или нет?
Принципы наследования и полиморфизма C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
el_gato_de_Ch
35 / 35 / 1
Регистрация: 28.04.2013
Сообщений: 110
01.02.2014, 19:03  [ТС]     Понятия инкапсуляции, полиморфизма и наследования #20
Цитата Сообщение от ValeryS Посмотреть сообщение

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

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

тогда получается, что проще всего базовым классом взять надо квадрат, потому что у него всего 1 угол и одна сторона и от него уже отнаследовать четырёхугольник, добавив ещё 3 поля для длин сторон и 3 поля для углов
Yandex
Объявления
01.02.2014, 19:03     Понятия инкапсуляции, полиморфизма и наследования
Ответ Создать тему
Опции темы

Текущее время: 00:36. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru