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

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

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

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

31.01.2014, 21:46. Просмотров 6443. Ответов 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
ValeryS
Модератор
6651 / 5060 / 470
Регистрация: 14.02.2011
Сообщений: 16,919
01.02.2014, 20:36 #31
Цитата Сообщение от Avazart Посмотреть сообщение
Отношение "реализуется посредством"
звучит красиво
лучше чем просто член класса
0
Avazart
Эксперт С++
7213 / 5385 / 286
Регистрация: 10.12.2010
Сообщений: 23,796
Записей в блоге: 17
01.02.2014, 20:54 #32
Цитата Сообщение от ValeryS Посмотреть сообщение
звучит красиво
лучше чем просто член класса
В данном случае да, но смысл может проявится, если к примеру сделать не просто объектом класса а указателем на него, и допустить что есть несколько типов точек, например точка которая рисуется не просто квадратиком(пикселем), а например крестиком или жирной точкой в несколько пикселей.И все это в виде отдельной иерархии.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
class Circle
{
     public:
        virtual void draw()const;
     private:
        AbstractPoint* center_; // SimplePoint,  CrossPoint, BoldPoint
}
 
Circle::draw()const
{
   // какие то действия для рисования самой окружности
   center->draw(); // рисуем центр
}
Но естественно лучше пример в книге Майерса где на основе класса std::list<> реализуется свой класс Set<> и поясняется почему не подходит наследование.
0
rrrFer
Заблокирован
02.02.2014, 09:41 #33
Цитата Сообщение от Avazart Посмотреть сообщение
Странно чет у Саттера не помню такого, может книга другая, можете указать на место в книге ?
Книга "Стандарты программирования на С++". Номера "правил" я указывал.

Цитата Сообщение от Avazart Посмотреть сообщение
Точка в математике не может иметь радиус, и странно будет если радиус появится в интерфейсе класса точки.
Другое дело подходить с точки зрения реализации то можно, реализовать точку посредством окружности.
Цитата Сообщение от ValeryS Посмотреть сообщение
встречались мне на просторах интернета лекции,в которых утверждалось что точка базовый класс и из него растут все фигуры
Холиваров не избежать. Причина, наверное, в хитрых словах типа "является", "реализуется посредством" и т.п. Понимать их можно по-разному. Если все эти слабоформализованные термины скрестить с математикой (где все бесконечно), то получится каша.

Если в моей программе квадрат является видом прямоугольника - то я и буду открыто наследовать. Если не является - не буду. Всякий матан тут вообще не при чем. С точками, пингвинами и прочим - аналогично.

Не по теме:

ЗЫ. "лекции на просторах интернета" могут написать как школьники, так и специально обученные американцы (чтобы запутать наших отважных студентов), и даже хитрые евреи и китайцы (преследуя свои коварные цели). И вот в этой теме тоже пишет куча дилетантов типа меня. Есть только один правильный путь - никому не верить, все перепроверить самостоятельно (набить шишек).



И вообще, изначально ТС хотел найти аналогии из жизни. Вот тут взяли "точку" и мусолят ее. Одни говорят, что окружность - множество точек. Другие - что квадрат - это 4 отверзка, а отрезок - множество точек. Третьи думают о точке на мониторе. Четвертые - о точке на бумаге. Пятые - о точке в пространстве (не двумерном). Шестые смотрят на точку, как на окружность нулевого радиуса.
У каждого тут своя точка. Зачем спорить то? - примера из жизни для ТС не получилось. Если в результате спора выйдет точка - то она будет совсем абстрактной )
0
Avazart
Эксперт С++
7213 / 5385 / 286
Регистрация: 10.12.2010
Сообщений: 23,796
Записей в блоге: 17
02.02.2014, 12:21 #34
Цитата Сообщение от rrrFer Посмотреть сообщение
Холиваров не избежать. Причина, наверное, в хитрых словах типа "является", "реализуется посредством" и т.п. Понимать их можно по-разному. Если все эти слабоформализованные термины скрестить с математикой (где все бесконечно), то получится каша.
Каша может быть в голове. В математике и других областях на которые следует опираться при моделировании все давно разложено по полочкам.
Описанная проблема с квадратом вызвана как раз тем что потребовалась операция увеличения площади,
которая не вписывается в математические знания, а значит не и модель не соответствует нашим ожиданиям, интуиции.

Цитата Сообщение от rrrFer Посмотреть сообщение
Одни говорят, что окружность - множество точек. Другие - что квадрат - это 4 отверзка, а отрезок - множество точек.
Множество точек это не точка, наследование неуместно.
Но никто не запрещает реализовать окружность множеством точке, а прямоугольник множеством линий.
Более того реализация не так важна, важно то какой интерфейс мы предоставляем пользователю.

Цитата Сообщение от rrrFer Посмотреть сообщение
Пятые - о точке в пространстве (не двумерном). Шестые смотрят на точку, как на окружность нулевого радиуса.
У каждого тут своя точка. Зачем спорить то? - примера из жизни для ТС не получилось. Если в результате спора выйдет точка - то она будет совсем абстрактной )
Насчет того почему точка не является окружностью нулевого радиуса я уже говорил.
То что у каждого "своя точка" это результат того что применения может быть разным.
Разрабатывая класс нужно представлять как и где его будут применять. (соответственно и результат разный в зависимости от применения)
А примеры из книг почти всегда абстрактны.
0
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,926
Записей в блоге: 1
02.02.2014, 13:02 #35
Avazart, ну так ты своими примерами кругов только доказываешь мою позицию!
Один и тот же Объект можно представить абсолютно по-разному.
Не все из этих представлений применимы на практике.
Не все из этих представлений подходят под каноны ООП.
Следовательно, на вопрос ТС ответ нет, объекты ООП не моделируют реальный мир, а лишь упрощают для программиста работу: позволяют эффективнее разбивать задачу на подсистемы, использовать в задаче проверенные наработки.
0
rrrFer
Заблокирован
02.02.2014, 13:19 #36
Цитата Сообщение от Avazart Посмотреть сообщение
Описанная проблема с квадратом вызвана как раз тем что потребовалась операция увеличения площади,
которая не вписывается в математические знания, а значит не и модель не соответствует нашим ожиданиям, интуиции.
Если прямоугольник будет задаваться двумя точками - левым и правым углами, а интерфейс будет позволять изменить высоту и ширину - вас не должно испугать то, что с шириной изменяются координаты.
Какие именно координаты изменятся? - у каждого свои ожидания - прямоугольник может вырасти как влево, так и в право, но может и в обоих направлениях.

Дак почему в этом случае вы будете утверждать, что модель соответствует ожиданиям, а если при изменении ширины изменится высота квадрата - не соответствует?

В одном случае при изменении ширины меняются координаты, в другом - высота.

Я уже писал, что в математике вообще нет никаких операций над квадратами и прямоугольниками. Это Ваши личные ожидания (в изменении площади).
Интерфейс квадрата зависит от контекста, в котором он используется. Ожидания должны зависеть от контекста тоже.

Цитата Сообщение от Avazart Посмотреть сообщение
Множество точек это не точка, наследование неуместно.
Я не предлагал ничего наследовать, я уже десятый раз предлагаю отойти от определений и посмотреть на контекст. Вы говорите про дверную ручку, другой - про шариковую, третий - про ручку дамы.
Цитата Сообщение от Avazart Посмотреть сообщение
Но никто не запрещает реализовать окружность множеством точке, а прямоугольник множеством линий.
Окружность - это бесконечное множество точек. Точка - это нечто бесконечно малое. Луч - это что-то бесконечно узкое и бесконечно длинное. Математика оперирует предельными значениями, компьютер так не умеет. Мир у нас тоже не цифровой, поэтому, возвращаясь к САБЖу, ООП - не инструмент описания картины мира, да?

Есть философские игры на тему яйца и курицы. Между ними (яйцом и курицей) есть связь, это очевидно. Но какая именно - определить трудно, а выражать это в терминах ООП (что пытается сделать ТС) вообще бессмысленно.

Не по теме:

Мне года пол назад кто-то тут поставил диагноз "ООП головного мозга", дак вот всем отписавшимся в теме сообщаю - вы тоже больны xD.

0
Avazart
Эксперт С++
7213 / 5385 / 286
Регистрация: 10.12.2010
Сообщений: 23,796
Записей в блоге: 17
02.02.2014, 13:41 #37
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Avazart, ну так ты своими примерами кругов только доказываешь мою позицию!
Один и тот же Объект можно представить абсолютно по-разному.
Не все из этих представлений применимы на практике.
Не все из этих представлений подходят под каноны ООП.
Ну так не нужно пытаться писать решение на все случаи жизни и не будет каши в голове.
Решайте конкретную задачу (+расчет на будущее) и все будет нормально.

Возможность применения зависит напрямую от того насколько вы точно определили задачу т.е составили модель. ("модель мира" не "сам мир" это его упрощение, выделение только важных для нашей задачи вещей, вспомните уроки физики, изучая гравитацию мы сознательно пренебрегаем сопротивление воздуха, или вспомним модель атома: Резерфорда,Бора)

Цитата Сообщение от rrrFer Посмотреть сообщение
Дак почему в этом случае вы будете утверждать, что модель соответствует ожиданиям, а если при изменении ширины изменится высота квадрата - не соответствует?
В одном случае при изменении ширины меняются координаты, в другом - высота.
Прочитайте всю задачу из книги.
Не соответствует или может не соответствует по тому как площадь квадрата(с помощью ф-ции) увеличивается на значительно большую величину нежели прямоугольник.
Хотя конечно и это можно продумать и поправить, но для этого придется лезть в ф-цию.
0
Kuzia domovenok
02.02.2014, 13:49
  #38

Не по теме:

Ну о чём спор?! Все какие-то примеры приводят... Вот мой: Один и тот же предмет можно представить и как материальную точку, и как абсолютно твёрдое тело, и как количество вещества...
Бла-бла-0 Бл@! Да я какой-то школьный учебник вспомнил!

0
aLarman
02.02.2014, 14:04
  #39

Не по теме:

ребят,а Вам не надоело? развести "срач" среди программистских понятий из-за кинутой на обсуждение темы, кто как понял пусть так и программирует, нечего человека и др людей вводить в заблуждения, порожденные собсвственной "призмой" восприятия реальности.
Что вообще есть знание? это истинное знание пропущенное через призму заблуждений, жизненного опыта и т.д. и у каждого человека эта призма. Так что навязывать человеку свою мысль, это практически бессмысленно, ибо он его опять же воспримет по-своему. И вообще как сказал Сократ - "Я знаю что я ничего не знаю и это все что я знаю" (не точная цитата и нечего поправлять меня)

0
Avazart
Эксперт С++
7213 / 5385 / 286
Регистрация: 10.12.2010
Сообщений: 23,796
Записей в блоге: 17
02.02.2014, 14:16 #40
Цитата Сообщение от rrrFer Посмотреть сообщение
Я не предлагал ничего наследовать, я уже десятый раз предлагаю отойти от определений и посмотреть на контекст. Вы говорите про дверную ручку, другой - про шариковую, третий - про ручку дамы.
Цитата Сообщение от rrrFer Посмотреть сообщение
Окружность - это бесконечное множество точек. Точка - это нечто бесконечно малое. Луч - это что-то бесконечно узкое и бесконечно длинное. Математика оперирует предельными значениями, компьютер так не умеет. Мир у нас тоже не цифровой, поэтому, возвращаясь к САБЖу, ООП - не инструмент описания картины мира, да?
И где тут контекст? Для решение определенных задач достаточно ограничится определенный количеством точек что бы получить необходимую точность в решении конкретной задачи и конкретного контекста.
Еще раз модель мира не сам мир.
Кто-то рисует портреты а кто-то карикатуры, и то и то искусство.
0
rrrFer
Заблокирован
02.02.2014, 17:53 #41
Цитата Сообщение от Avazart Посмотреть сообщение
И где тут контекст? Для решение определенных задач достаточно ограничится определенный количеством точек что бы получить необходимую точность в решении конкретной задачи и конкретного контекста.
Толсто не читать сообщение целиком. Я привожу пример, красиво иллюстрирующий, что без учета контекста нормального результата достичь не получится. Ты цитируешь этот пример и спрашиваешь "где тут контекст"?

Я цитирую абзац целиком:
Цитата Сообщение от Avazart Посмотреть сообщение
Еще раз модель мира не сам мир.
О чем Вы? - по определению, абзац - это мысль. Я тут мысли в упор не вижу. Не вижу и запятых. Что ты хочешь сказать?

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

У тебя в голове есть какие-то фантазии на тему квадратов и прочих фигур, о которых мы не догадываемся. Или ты нормально все опишешь с запятыми, или тебя никто не поймет.
0
Avazart
Эксперт С++
7213 / 5385 / 286
Регистрация: 10.12.2010
Сообщений: 23,796
Записей в блоге: 17
02.02.2014, 18:04 #42
Цитата Сообщение от rrrFer Посмотреть сообщение
У тебя в голове есть какие-то фантазии на тему квадратов и прочих фигур, о которых мы не догадываемся. Или ты нормально все опишешь с запятыми, или тебя никто не поймет.
Кто еще воображала?
Я говорю о конкретном примере из книги.
Цитата Сообщение от rrrFer Посмотреть сообщение
С помощью какой "ф-ции"?
makeBigger()

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class Rectangle 
{
public:
 virtual void setHeight(int newHeight);
 virtual void setWidth(int newWidth);
 virtual int height () const;
 virtual int width() const;
};
 
void makeBigger(Rectangle& r)
{
int oldHeight = r.height();
r.setWidth(r.width() + 10);
assert(r.height() == oldHeight); 
}
 
class Square: public Rectangle 
{ 
};
 
Square s;
...
assert(s.width() == s.height ());
makeBigger(s);
assert (s.width() == s.height());
Возьмите книгу посмотрите пример, думаю это не так сложно что бы говорить в "тему"
0
ValeryS
Модератор
6651 / 5060 / 470
Регистрация: 14.02.2011
Сообщений: 16,919
06.02.2014, 08:21 #43
Цитата Сообщение от Avazart Посмотреть сообщение
А кто ее туда помещал, это лишь возможный объект для компоновки.
ну вот тебе реальный пример
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//описание класса Точка
struct TPoint{
 int x,y,vx,vy,vt;
 int color;
 
//конструктор объекта Точка
 TPoint(int ix,int iy,int icolor);
 virtual ~TPoint();
 virtual void Draw(int icolor);
 void Show();//функция отображения
 void Hide();//функция скрытия
 void MoveXY(int ix, int iy);
};
//описание класса Прямоугольник на основании наследования структуры объекта Точка
struct TBox: public TPoint{
 int w,h;
Опишите код - какая функция за что отвечает?
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.02.2014, 08:21
Привет! Вот еще темы с ответами:

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
43
Yandex
Объявления
06.02.2014, 08:21
Ответ Создать тему
Опции темы

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