Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/9: Рейтинг темы: голосов - 9, средняя оценка - 5.00
2 / 2 / 1
Регистрация: 21.09.2013
Сообщений: 76
1

Инкапсуляция. классы

27.10.2013, 17:08. Показов 1710. Ответов 19
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый вечер. История такая: Разбирался с инкапсуляцией классов. Но не могу сформулировать точно, кратко и ёмко как всё происходит. В целом я понимаю как устроено, но в общем смысле как то не формулируется. Говорили мне что есть какая то таблица на msdn которая всё это раскрывает. Поможете?)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.10.2013, 17:08
Ответы с готовыми решениями:

Инкапсуляция. Классы и их компоненты. Объекты
Здравствуйте. Помогите пожалуйста.Вот есть у меня задание: Разработать класс, инкапсулирующий...

инкапсуляция
Возможно ли определение пользовательского типа, чтобы им можно было пользоваться только внутри...

Инкапсуляция.
Написать программу имитирующую работу банковского счета методом инкапсуляции. Программа должна быть...

Инкапсуляция
Смотрел обучающие видео , читал книжки и не понял. Инкапсуляция позволяет обращаться к свойствам...

19
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
27.10.2013, 17:40 2
Дайте хоть немного конкретики, чтобы было понятно в чем вопрос. Общий ответ - читать книги до полного просветления.
0
2 / 2 / 1
Регистрация: 21.09.2013
Сообщений: 76
27.10.2013, 17:48  [ТС] 3
наследование классов с private, public, protected. Я понимаю что происходит при этом.
при public у базового public и protected не изменяются
при private у базового public и protected становятся private
при protected у базового public и protected становятся protected

но как это обобщить?)
0
383 / 281 / 31
Регистрация: 04.09.2009
Сообщений: 1,225
27.10.2013, 17:54 4
vovkasm,
Надо вспомнить немного истории...
Сразу программы писали одним "стогом" подряд и запускали на выполнение.
Позже такой подход стал несколько неудобным и была сформулирована процедурная парадигма программирования - "Обертывайте все инструкции в функции, используйте наилучшие известные алгоритмы".
Но вот ведь незадача - эти функции должны манипулировать какими-то данными, а эти данные приходилось делать глобальными и общими. Теперь каждая функция, дергала эти данные, изменяя их по своему хотению, что выливалось потом в мучительные часы отладки и ловли ошибок.
С появлением языка Си и ключевого слова static появилась некоторая пародия на инкапсуляцию. Но это другая тема, продолжим повествование на примере С++.

Итак, описав класс, мы можем создать сущность (объект) этого класса. В его приватном поле располагаются некоторые данные и они недоступны остальной программе, кроме внутренних функций-членов этого объекта.
Теперь все функции не смогут "дергать" эти данные, пока мы им не разрешим. В идеале, разрешать не рекомендуется) Программа может послать запрос (сигнал) нашему объекту "можно я посмотрю, что у тебя хранится в этом поле?" и объект сам решает (исходя из наличия у него в открытом интерфейсе функций доступа) давать программе эти данные или не давать.
В итоге вся программа (ну почти) состоит из изолированных объектов, которые инкапсулируют (скрывают) у себя данные, ну и заодно функции, которые эти данные меняют.
Ну как-то так упрощенно...
А вообще читай книжки - там это последовательно изложено и разжевано.
1
2 / 2 / 1
Регистрация: 21.09.2013
Сообщений: 76
27.10.2013, 18:23  [ТС] 5
gromo, это всё понятно))

мне сказали можно главную суть этого всего поместить в одно предложение, и ещё другой способ - таблица с msdn, которую я как не бился - не нашёл.

а можешь ещё так же красиво расписать про наследование классов с разными уровнями защиты(pub, priv, prot) реально нужная инфа начинающим))
0
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
27.10.2013, 18:30 6
Цитата Сообщение от vovkasm Посмотреть сообщение
при public у базового public и protected не изменяются
при private у базового public и protected становятся private
при protected у базового public и protected становятся protected
но как это обобщить?)
Ну вобще все уже написано)
Если зайти с другой стороны, то можно сказать, что public-наследование означает связь типа "является". Т.е. если класс B является наследником класса A, то "A является B". При этом наследуется интерфейс и реализация.
class Rectangle : public Shape - прямоугольник является фигурой.

Private наследование выражает отношение "содержит" или "реализовано посредством". При этом наследуется реализация, но не интерфейс.

Подробно описано у Майерса (Эффективное использование С++: 55 верных советов... ), Глава 6, правила 32, 34, 38, 39.
1
383 / 281 / 31
Регистрация: 04.09.2009
Сообщений: 1,225
27.10.2013, 18:33 7
Цитата Сообщение от vovkasm Посмотреть сообщение
а можешь ещё так же красиво расписать про наследование классов с разными уровнями защиты(pub, priv, prot) реально нужная инфа начинающим))
ну красивее Страуструпа вряд ли опишу
Миниатюры
Инкапсуляция. классы  
1
Игогошка!
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
27.10.2013, 19:05 8
Цитата Сообщение от 0x10 Посмотреть сообщение
Если зайти с другой стороны, то можно сказать, что public-наследование означает связь типа "является". Т.е. если класс B является наследником класса A, то "A является B". При этом наследуется интерфейс и реализация.
class Rectangle : public Shape - прямоугольник является фигурой.
Ну я бы не использовал слово "является". Так можно и квадрат от прямоугольника отнаследовать, потому что квадрат является прямоугольником, хотя это явное нарушение принципа подстановки Лисков.
0
2 / 2 / 1
Регистрация: 21.09.2013
Сообщений: 76
27.10.2013, 19:09  [ТС] 9
Цитата Сообщение от 0x10 Посмотреть сообщение
Ну вобще все уже написано)
Если зайти с другой стороны, то можно сказать, что public-наследование означает связь типа "является". Т.е. если класс B является наследником класса A, то "A является B". При этом наследуется интерфейс и реализация.
class Rectangle : public Shape - прямоугольник является фигурой.

Private наследование выражает отношение "содержит" или "реализовано посредством". При этом наследуется реализация, но не интерфейс.

Подробно описано у Майерса (Эффективное использование С++: 55 верных советов... ), Глава 6, правила 32, 34, 38, 39.
Вооооо, Спасибо, вот это нормааально. public наследует интерфейс и реализацию, а private только реализация.
protected тоже только реализацию? или хитрость какая то?)

Добавлено через 54 секунды
Цитата Сообщение от ct0r Посмотреть сообщение
Ну я бы не использовал слово "является". Так можно и квадрат от прямоугольника отнаследовать, потому что квадрат является прямоугольником, хотя это явное нарушение принципа подстановки Лисков.
по Майерсу именно "Является" открой 32е правило))
0
Игогошка!
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
27.10.2013, 19:22 10
Цитата Сообщение от vovkasm Посмотреть сообщение
по Майерсу именно "Является" открой 32е правило))
У него все нормально. Он явно указывает, что значение слова "является" отличается от интуитивного и общепринятого. Он там же говорит о принципе подстановки Лисков, просто не указывает, что это называется именно так.
0
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
27.10.2013, 19:40 11
Цитата Сообщение от vovkasm Посмотреть сообщение
protected тоже только реализацию?
Да, но полезных жизненных примеров для такого наследования сходу не придумаю.

Цитата Сообщение от ct0r Посмотреть сообщение
Ну я бы не использовал слово "является"
Цитата Сообщение от ct0r Посмотреть сообщение
У него все нормально.
Считаем, что я говорю в том же контексте.
0
383 / 281 / 31
Регистрация: 04.09.2009
Сообщений: 1,225
27.10.2013, 19:50 12
Цитата Сообщение от vovkasm Посмотреть сообщение
public наследует интерфейс и реализацию, а private только реализация.
protected тоже только реализацию? или хитрость какая то?)
А что подразумеваешь под словом "реализация" ?

Добавлено через 1 минуту
Дело в том, что private-наследование (да и protected) наследует и открытые члены, и защищенные.
Теперь в объекте-наследнике открытый интерфейс базового класса стал частью "реализации".
1
2 / 2 / 1
Регистрация: 21.09.2013
Сообщений: 76
27.10.2013, 19:57  [ТС] 13
Цитата Сообщение от gromo Посмотреть сообщение
А что подразумеваешь под словом "реализация" ?
Добавлено через 1 минуту
Дело в том, что private-наследование наследует и открытые члены, и защищенные.
Теперь в наследнике интерфейс базового класса стал частью "реализации".
ну реализация - это сама реализация функций, а не их описание(интерфейс). грубо говоря .cpp а не .h
так ведь?
0
383 / 281 / 31
Регистрация: 04.09.2009
Сообщений: 1,225
27.10.2013, 19:58 14
Цитата Сообщение от vovkasm Посмотреть сообщение
ну реализация - это сама реализация функций, а не их описание(интерфейс). грубо говоря .cpp а не .h
так ведь?
В данном контексте это не совсем так.
Здесь интерфейсом класса мы называем ОТКРЫТЫЕ функции-члены этого класса (со спецификатором public: ).

Реализацией же, называют все те функции, которые скрыты от непосредственного пользователя нашего класса.

Если пользователь производный класс, то для него реализацией будут только private: функции и данные родителя.

Если пользователь остальная программа, то для нее реализацией будет все что под грифом protected: u private:
*.cpp файлы в данном случае не причем совсем
1
2 / 2 / 1
Регистрация: 21.09.2013
Сообщений: 76
27.10.2013, 20:10  [ТС] 15
gromo,

Тогда утверждение ниже не совсем верно.

Цитата Сообщение от gromo Посмотреть сообщение
public наследует интерфейс и реализацию, а private только реализация.
protected тоже только реализацию? или хитрость какая то?)
так как private наследует и интерфейс и реализацию, только интерфейс становится реализацией.
с protected точно так же.

почему
Цитата Сообщение от gromo Посмотреть сообщение
Если пользователь остальная программа, то для нее реализацией будет все что под грифом protected: u private:
private будет для остальной программы реализацией, если он вообще недоступен ей?

Добавлено через 1 минуту
А всё, уловил.

Добавлено через 2 минуты
тогда private и protected-наследование наследует интерфейс, а не реализацию, для них реализация - private:.

Добавлено через 2 минуты
Цитата Сообщение от gromo Посмотреть сообщение
Если пользователь производный класс, то для него реализацией будут только private: функции и данные родителя.
а protected будет для него интерфейсом?
0
383 / 281 / 31
Регистрация: 04.09.2009
Сообщений: 1,225
27.10.2013, 20:16 16
vovkasm,
вот не надо кашу заваривать только
Цитата Сообщение от vovkasm Посмотреть сообщение
private будет для остальной программы реализацией, если он вообще недоступен ей?
В этом же и основная идея инкапсуляции - пользователь не должен знать что там делается.
//--------------------------------------------------------------------------------------------------------------------------------------------
Вот таблица с MSDN, если так уж надо)
http://msdn.microsoft.com/en-u... 5fat0.aspx
1
2 / 2 / 1
Регистрация: 21.09.2013
Сообщений: 76
27.10.2013, 20:18  [ТС] 17
gromo, Урааа табличка, щас высплюсь и надеюсь всё уложится. Последний вопрос остался, точнее уточнение :
Цитата Сообщение от vovkasm Посмотреть сообщение
Сообщение от gromo
Если пользователь производный класс, то для него реализацией будут только private: функции и данные родителя.
а protected будет для него интерфейсом?
0
383 / 281 / 31
Регистрация: 04.09.2009
Сообщений: 1,225
27.10.2013, 20:23 18
Цитата Сообщение от vovkasm Посмотреть сообщение
а protected будет для него интерфейсом?
Ну можно и так сказать, ведь в производный класс попадают открытые и защищенные члены родителя.
1
2 / 2 / 1
Регистрация: 21.09.2013
Сообщений: 76
27.10.2013, 20:25  [ТС] 19
gromo, Во, пока вроде все) Спасибо огромное замучал наверное^^
0
383 / 281 / 31
Регистрация: 04.09.2009
Сообщений: 1,225
27.10.2013, 20:43 20
vovkasm, всегда пожалуйста)
0
27.10.2013, 20:43
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.10.2013, 20:43
Помогаю со студенческими работами здесь

инкапсуляция методов
можно ли в С ++ инкапсулировать методы? чтобы один метод был доступен только после вызова другого

wxDev-C++ и инкапсуляция
Всем привет. Учусь по книжке Дейтелов, дошел до классов. Авторы пропагандируют методику сокрытия...

Наследование и инкапсуляция в C++
Как осуществляется наследование свойств объектов и инкапсуляция в C++?

Инкапсуляция в ООП и C++
Вы используете в классе геттеры и сеттеры (функции). Отделяйте спецификацию от реализации...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru