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

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

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

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

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

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

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

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

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

Пример из программирования: перегрузка функций (методов класса наследника), одни и те же поля класса наследника могут иметь различный тип.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.01.2014, 21:46     Понятия инкапсуляции, полиморфизма и наследования
Посмотрите здесь:
Задания о наследовании, инкапсуляции и полиморфизма на C#/ нужно как можно быстро C++
Принципы наследования и полиморфизма C++
чем отличаются структуры для наследования интерфейса, от структур, для наследования реализаций C++
C++ Об инкапсуляции данных в ООП
C++ Обход инкапсуляции класса
C++ Нарушение инкапсуляции или нет?
C++ Провете класс на предмет ошибок инкапсуляции
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Anton_Kretov
89 / 51 / 7
Регистрация: 26.06.2013
Сообщений: 179
31.01.2014, 23:43     Понятия инкапсуляции, полиморфизма и наследования #2
Про инкапсуляцию согласен, с наследованием не совсем. Пример не совсем корректен. Было бы лучше так:
Суперкласс: телефон
Наследники: домашний телефон, сотовый телефон
Kuzia domovenok
1890 / 1745 / 118
Регистрация: 25.03.2012
Сообщений: 5,924
Записей в блоге: 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
262 / 261 / 33
Регистрация: 03.02.2013
Сообщений: 715
01.02.2014, 02:49     Понятия инкапсуляции, полиморфизма и наследования #5
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Пытаться проводить параллели ООП с объектами из жизни - довольно бесполезное занятие.
если так - то тогда вообще ООП не имеет смысла по большому счёту, учите haskell, во имя добра)
ООП так и задумана, чтобы была абстракция, инкапсуляция, наследование, полиморфизм, в общем всё то, что мы наблюдаем за окном, а не в экране монитора листинга ассемблера/Си

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

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

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

Добавлено через 9 минут
abit, пока ты называешь наследование "старым приёмом, который раньше назывался агрегированием", тебе лучше воздержаться отвечать на вопросы о наследовании!
gray_fox
What a waste!
1446 / 1175 / 61
Регистрация: 21.04.2012
Сообщений: 2,463
Завершенные тесты: 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
642 / 563 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
01.02.2014, 12:42     Понятия инкапсуляции, полиморфизма и наследования #9
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Ну попробуй-ка привяжи к ним что-нибудь из некоторых паттернов, например!
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
"декоратор", "стратегию"
Читаю книгу по паттернам, там все паттерны привязаны к реальным объектам, в частности декоратор стратегия, и .др
Kuzia domovenok
1890 / 1745 / 118
Регистрация: 25.03.2012
Сообщений: 5,924
Записей в блоге: 1
01.02.2014, 13:12     Понятия инкапсуляции, полиморфизма и наследования #10
aLarman, притянуто за уши. В реале никаких "стратегий" не бывает. Что я хотел сказать, так это: если программисту нужен некоторый интерфейс для его объектов, он смело создаёт абстрактный класс и наследуется от него. Никаких аналогов в реале он не ждёт. Нужен ему какой-то абстрактный inputReader - пожалуйста!

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

Не по теме:

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

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

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

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

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

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

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

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

Добавлено через 1 час 59 минут
Цитата Сообщение от rrrFer Посмотреть сообщение
Дак вот квадрат является прямоугольником, стороны которого имеют равную длину. Мне кажется, Саттер одобрил бы наследование. (см. правило 37 у Саттера).
Может у Мейерса ? У него вроде есть об этом и у него "правила", а у Саттера вроде в "задачах" все.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.02.2014, 17:31     Понятия инкапсуляции, полиморфизма и наследования
Еще ссылки по теме:
C++ Использование полиморфизма
C++ Реализация полиморфизма
C++ иллюстрация полиморфизма
Виды полиморфизма C++ C++

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

Или воспользуйтесь поиском по форуму:
korvin_
1711 / 1249 / 191
Регистрация: 28.04.2012
Сообщений: 4,525
01.02.2014, 17:31     Понятия инкапсуляции, полиморфизма и наследования #15
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
полиморфизма нет
Ну как же, ты можешь бросить камень или гранату, например, т.е. твое действие «бросок» полиморфно относительно предмета броска. =)

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

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

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

Цитата Сообщение от abit Посмотреть сообщение
реального полиморфизма в С++ я не видел
И каков он «реальный полиморфизм»?
Yandex
Объявления
01.02.2014, 17:31     Понятия инкапсуляции, полиморфизма и наследования
Ответ Создать тему
Опции темы

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