Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

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

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

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

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

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

Пример из программирования: перегрузка функций (методов класса наследника), одни и те же поля класса наследника могут иметь различный тип.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.01.2014, 21:46
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Понятия инкапсуляции, полиморфизма и наследования (C++):

Задания о наследовании, инкапсуляции и полиморфизма на C#/ нужно как можно быстро - C++
Создать класс библиографических описаний книг CBookCard. В классе должны быть закрытые поля: автор, заглавие, издательство, год издания,...

Принципы наследования и полиморфизма - C++
Даны натуральное число n, действительные числа a1 a2,...,an. Если последовательность a1 ,a2 ,...,an упорядочена по неубыванию, то...

Чем отличаются структуры для наследования интерфейса от структур для наследования реализаций? - C++
Дорогие программисты, во первых, хочу поздравить вас с Наступающим новым Годом! Я к вам обращаюсь с маленькой просьбой. Я никак не могу...

Обход инкапсуляции класса - C++
#include <iostream> using namespace std; class My_class { private: char* name; public: My_class() {

Об инкапсуляции данных в ООП - C++
Добрый день, почти сделал лабу, но нужно устранить замечание. Идея такая, Должен быть класс поставщик, от него делается два подкласса,...

Нарушение инкапсуляции или нет? - C++
В общем экспериментируя с крестами сделал такую штуку и не могу понять это нарушение инкапсуляции или нет? #include <iostream> class...

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

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

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

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

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

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

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

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

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

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

Не по теме:

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

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

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

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

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

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

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

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

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

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

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

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

Цитата Сообщение от abit Посмотреть сообщение
реального полиморфизма в С++ я не видел
И каков он «реальный полиморфизм»?
0
01.02.2014, 17:31
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.02.2014, 17:31
Привет! Вот еще темы с ответами:

Нарушение инкапсуляции или нет? - C++
Есть такой код: class Tune { private: vector<int> A; public: const vector<int>& get_A() const { return A; } // <- не...

Провете класс на предмет ошибок инкапсуляции - C++
Добрый день! Недавно начал изучение ООП C++ и вот настал момент, когда я создал свой первый класс и обьект. Хочу попросить проверить его на...

Виды полиморфизма C++ - C++
Разбираю полиморфизм. Наткнулся на классификацию с тремя видами:1.специальный, 2.параметрический и 3.подтипов(включения). Все ли...

иллюстрация полиморфизма - C++
Доброго времени суток!написал примитив для иллюстрации полиморфизма,ориентировался по видеокурсам с ТыТрубы #include<iostream.h> ...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

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