Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

C_Kurs_Lekt / DOC_RAZNOE / TEMA-2 / OOПрог_раздатка

.pdf
Скачиваний:
14
Добавлен:
13.02.2016
Размер:
206.86 Кб
Скачать

ЛЕКЦИИ

1

ОБЗОР ОБЪЕКТНО-ОРИЕНТИРОВАННОГО ПРОГРАММИРОВАНИЯ.

Немного истории программирования. Введение в ООП.

Объект. Инкапсуляция.

Наследование (Inheritance).

Полиморфизм. Класс.

НЕМНОГО ИСТОРИИ ПРОГРАММИРОВАНИЯ.

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

Первые программы создавались посредством переключателей на панели компьютера. Вполне очевидно, что подобного рода способ подходил только для небольших программ. Затем программы стали писать на языке машинных команд. С изобретением ассемблера (язык низкого уровня) стали появляться сравнительно длинные программы. Настоящим прорывом в программировании стало создание первого языка программирования высокого уровня - Фортран в 1950 году. С этого времени появилась возможность писать программы до нескольких тысяч строк длинной. Однако увеличение объема программ привело к тому, что код больших программ становился практически нечитаемым, а зачастую даже неуправляемым. Избавление от подобного рода проблем неструктурного программирования пришло с изобретением в начале 60-х годов таких языков структурного программирования как Алгол, С и Паскаль. Начался "золотой век" структурного программирования. В основу структурного программирования легли точно обозначенные управляющие структуры. Оно характерно использованием автономных подпрограмм, в которых поддерживаются рекурсия и локальные переменные, и абсолютным неприятием операторов GOTO(переход на другую строку). С появлением структурного программирования появилась возможность разбивать программы на составляющие элементы. Применяя эти принципы программирования, появилась возможность создания и поддержки программ в несколько десятков тысяч строк.

Несомненно, что структурное программирование принесло выдающиеся результаты, но, как оказалось, даже эти принципы программирования становятся несостоятельными, когда программа достигает определенной длины. Для написания более сложных программ потребовался новый подход к программированию.

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

Наконец-то мы добрались до самого ООП !

Так что же такое ООП и с чем его едят, в чем его основные преимущества ? А вот об этом мы поговорим на следующем шаге.

ВВЕДЕНИЕ В ООП.

Итак, в чем же основные преимущества ООП, почему оно стало таким популярным ?

Как ни странно, но трудно ответить на этот вопрос не объяснив базовых понятий. Уверен, что усвоив базовые понятия ООП, вы сами без труда ответите на этот вопрос.

Несмотря на то, что в различных источниках делается акцент на те или иные особенности внедрения и применения ООП, 3 основных (базовых) понятия ООП остаются неизменными. К ним относятся:

Наследование (Inheritance)

Инкапсуляция (Encapsulation)

Полиморфизм (Polymorphism)

ЛЕКЦИИ

2

Эти понятия, как три кита, лежат в основе мира ООП и, конечно же, будут рассмотрены мною подробнейшим образом. Наряду с ними будет рассмотрен и ряд других понятий и определений.

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

Итак, первое из них имеет некоторый академический оттенок:

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

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

Не очень понятно ? Тогда попробуем зайти с другой стороны и упростим описание. Начнем с общеизвестного примера.

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

Что Вы сделали для того, чтобы получить соль ? Просто сказали: "Передай мне, пожалуйста, соль".

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

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

Так в чем же принципиальная разница ?

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

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

Этот простой пример иллюстрирует только один из принципов ООП, суть которого: "Объект отвечает за все действия, которые он производит в ответ на запрос клиента".

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

ОБЪЕКТ.

Название "Объектно-ориентированное программирование" говорит само за себя. Центром внимания ООП является объект.

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

ЛЕКЦИИ

3

Рассмотрим физические объекты, которые нас окружают. Про любой из физических объектов можно сказать, что он:

1.имеет какое-то состояние (или находится в каком-то состоянии). К примеру, про собаку можно сказать, что она имеет имя, окраску, возраст, голодна она или нет и т.д.

2.имеет определенное поведение. Т.е., та же собака может вилять хвостом, есть, лаять, прыгать и т.д.

Атеперь рассмотрим формальное определение объекта в ООП:

Объект- это осязаемая сущность, которая четко проявляет свое поведение. Объект состоит из следующих трех частей:

имя объекта;

состояние (переменные состояния);

методы (операции).

Не правда ли, очень похоже ? Мы только не указали, что объект должен иметь имя. Но, как Вы сами понимаете, нам это необходимо для идентификации конкретного объекта. Впрочем, практически все физические объекты мы как-либо уникально идентифицируем. Иначе, как мы разберемся где есть какой объект ?

Обобщенное определение:

Объект ООП - это совокупность переменных состояния и связанных с ними методов(операций). Эти методы определяют как объект взаимодействует с окружающим миром.

Возможность управлять состояниями объекта посредством вызова методов в итоге и определять поведение объекта. Эту совокупность методов часто называют интерфейсом объекта.

А теперь в двух словах о нескольких терминах ООП:

Класс (class) - это группа данных и методов(функций) для работы с этими данными. Это шаблон. Объекты с одинаковыми свойствами, то есть с одинаковыми наборами переменных состояния и методов, образуют класс.

Объект (object)- это конкретная реализация, экземпляр класса. В программировании отношения объекта и класса можно сравнить с описанием переменной, где сама переменная(объект) является экземпляром какого-либо типа данных(класса).

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

Методы (methods)- это функции(процедуры), принадлежащие классу.

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

Возможно некоторые моменты пока не очевидны для Вас. Уверен, что основные понятия ООП объяснят все возникающие на данном этапе вопросы.

ИНКАПСУЛЯЦИЯ.

Инкапсуляция является одним из ключевых понятий ООП.Для начала приведу формальное определение этого понятия:

Инкапсуляция - это механизм, который объединяет данные и методы, манипулирующие этими данными, и защищает и то и другое от внешнего вмешательства или неправильного использования. Когда методы и данные объединяются таким способом, создается объект.

ЛЕКЦИИ

4

Итак, зачем же нам нужна инкапсуляция ? Ответ прост, мы - люди. А человеку свойственно ошибаться. Никто не застрахован от ошибок. Применяя инкапсуляцию, мы, как бы, возводим крепость, которая защищает данные, принадлежащие объекту, от возможных ошибок, которые могут возникнуть при прямом доступе к этим данным. Кроме того, применение этого принципа очень часто помогает локализовать возможные ошибки в коде программы. А это на много упрощает процесс поиска и исправления этих ошибок.

Можно сказать, что инкапсуляция подразумевает под собой скрытие данных (data hiding), что позволяет защитить эти данные.

А теперь определение, которое, как мне кажется, наиболее точно определяет суть инкапсуляции:

Переменные состояния объекта скрыты от внешнего мира. Изменение состояния объекта (его переменных) возможно ТОЛЬКО с помощью его методов(операций).

Почему же это так важно ? Этот принцип позволяет защитить переменные состояния объекта от неправильного их использования.

Это существенно ограничивает возможность введения объекта в недопустимое состояние и/или несанкционированное разрушение этого объекта.

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

машинах. Вы открываете капот и начинаете выдергивать какие-то шланги, что-то окручивать. и т.д. Хорошо, если Вы запомнили что, где и как выдергивали и откручивали. А если нет ? Или, у Вас стрелка уровня топлива стоит на нуле, а Вы считаете, что у Вас полно топлива и полезете со спичками внутрь бензобака проверять уровень топлива. Какие последствия Вас могут ожидать ? В лучшем случае Вы и Ваша машина останутся живы, если Вам о-о-очень повезет.

Аналогично и с нашими объектами, которые могут быть чрезвычайно сложными, а Вы пытаетесь что-то в них подправить, не представляя их внутреннюю организацию.

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

Описанный мною постулат отражает простую житейскую мудрость: не знаешь, не представляешь как что-то сделать - попроси это сделать того, кто знает как это правильно надо сделать. К сожалению, все мы (и я не исключение) на каждом шагу пренебрегаем этим правилом.

В ООП мы это правило определяем как закон: "Объект не приемлет дилетантов. Только 'специалисты' могут как-либо изменять состояние объекта." И это правильно !

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

Хорошим примером применения принципа инкапсуляции являются команды доступа к файлам. Обычно доступ к данным на диске можно осуществить только через специальные функции. Вы не имеете прямой доступ к данным, размещенным на диске. Таким образом, данные, размещенные на диске, можно рассматривать скрытыми от прямого Вашего вмешательства. Доступ к ним можно получить с помощью специальных функций, которые по своей роли схожи с методами объектов. При этом, хотелось бы отметить два момента, которые важны при применении этого подхода. Во-первых, Вы можете получить все данные, которые Вам нужны за счет законченного интерфейса доступа к данным. И, во-вторых, Вы не можете получить доступ к тем данным, которые Вам не нужны. Это предотвращает случайную порчу данных, которая возможна при прямом обращении к файловой системе. Кроме того, это предотвращает получение неверных данных, т.к. специальные функции обычно используют последовательный доступ к данным.

Как известно, ни что в этом мире не дается даром. Применение этого метода ведет к снижению эффективности доступа к элементам объекта. Это обусловлено необходимостью вызова ме-

ЛЕКЦИИ

5

тодов для изменения внутренних элементов(переменных) объекта. Однако, при современном уровне развития вычислительной техники, эти потери в эффективности не играют существенной роли.

Я думаю, что здесь же стоит упомянуть еще одно понятие ООП. Это абстрактные типы данных (ABSTRACT DATA TYPES). Абстрактный тип данных - это группа тесно связанных между собой данных и методов(функций), которые могут осуществлять операции над этими данными.

Поскольку подразумевается, что эта структура защищена от внешнего влияния, то она считается инкапсулированной структурой. Важным же отличием от других аналогичных структур является то, что данные заключенные в этой структуре, тесно связанны и активно взаимодействуют между собой внутри структуры. Подобные структуры имеют слабые связи с внешним миром посредством ограниченного интерфейса. Суть подобных структур довольно проста: данные имеют тесные взаимосвязи внутри структуры, но слабые связи с внешним миром посредством ограниченного числа методов. Таким образом, структуры подобного рода имеют достаточно простой, но эффективный интерфейс, что позволяет их легко интегрировать в программах. Проведем аналогию. Рассмотрим монитор как единый объект. Я думаю, на много приятнее иметь дело с несколькими кнопками на Вашем мониторе для того, чтобы его настроить, чем копаться в его внутренностях, пытаясь его настроить. Для того, чтобы настроить монитор необходимо знать только простой интерфейс настройки и все. А для его подключения к компьютеру достаточно только подключить интерфейсный кабель. Просто, удобно, доступно (звучит как рекламный ролик) !

НАСЛЕДОВАНИЕ (INHERITANCE).

Наследования является одним из фундаментальных понятий ООП. Приведем его определе-

ние:

Наследование - это процесс, посредством которого, один объект может наследовать свойства другого объекта и добавлять к ним черты, характерные только для него.

Суть понятия Наследование кроется уже в самом названии. Приведем пример наследования из реальной жизни.

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

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

Смысл и универсальность наследования заключается в том, что не надо каждый раз заново (с нуля) описывать новый объект, а можно указать родителя(базовый класс) и описать отличительные особенности нового класса. В результате, новый объект будет обладать всеми свойствами родительского класса плюс своими собственными отличительными особенностями.

Приведем пример. Можно создать какой-то базовый класс "транспортное средство", который универсален для всех средств передвижения, к примеру, на 4-х колесах. Этот класс "знает" как двигаются колеса, как они поворачивают, тормозят и т.д. А затем на основе этого класса создадим класс "легковой автомобиль", который унаследуем из класса "транспортное средство". Поскольку мы новый класс унаследовали из класса "транспортное средство", то мы и унаследовали все особенности этого класса и нам не надо в очередной раз описывать как двигаются колеса и т.д. Мы

ЛЕКЦИИ

6

просто добавим те черты, особенности поведения, которые характерны для легковых автомобилей. В то же время мы можем взять за основу этот же класс "транспортное средство" и построить класса "грузовые автомобили". Описав отличительные особенности грузовых автомобилей, мы получим уже новый класс "грузовые автомобили". А, к примеру, на основании класса "грузовой автомобиль" уже можно описать определенный подкласс грузовиков и т.д. Таким образом, нам не надо каждый раз описывать все "с нуля". В этом и заключается главное преимущество использования механизма наследования. Мы как бы сначала формируем простой шаблон, а затем все усложняя и конкретизируя, поэтапно создаем все более сложный шаблон.

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

И немного о терминологии. В описаниях языков ООП принято класс, из которого наследуют называть родительским классом (parent class) или основой класса(base class). Класс, который получаем в результате наследования называется порожденным классом (derived or child class). Родительский класс всегда считается более общим и развернутым. Порожденный же класс всегда более строгий и конкретный, что делает его более удобным в применении при конкретной реализации.

Как вывод из всего сказанного приведу следующее мнение, что:

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

ПОЛИМОРФИЗМ.

Слово полиморфизм имеет греческое происхождение и переводится как "имеющий много форм".

Общее определение:

Полиморфизм - это свойство, которое позволяет одно и тоже имя использовать для решения нескольких технически разных задач.

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

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

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

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

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

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

ЛЕКЦИИ

7

К примеру, у нас есть класс "автомобиль", в котором описано как должен передвигаться автомобиль, как он поворачивает, как подает сигнал и т.д. Там же описан метод "переключение передачи". Допустим, что в этом методе класса "автомобиль" мы описали автоматическую коробку передач. А теперь нам необходимо описать класс "спортивный автомобиль", у которого механическое(ручное) переключение скоростей. Конечно, можно было бы описать заново все методы для класса "спортивный автомобиль". Но зачем, если у нас уже практически все описано и отлажено ?! Для этого и существует механизм наследования. Мы указываем, что класс "спортивный автомобиль" наследован из класса "автомобиль", а следовательно он обладает всеми свойствами и методами, описанными для класса-родителя. Единственное, что нам надо сделать - это переписать метод "переключение передач" для механической коробки передач. В результате, при вызове метода "переключение передач" будет выполняться метод не родительского класса, а самого класса "спортивный автомобиль".

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

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

КЛАСС.

Класс (class) - это группа данных и методов(функций) для работы с этими данными. Это шаблон. Объекты с одинаковыми свойствами, то есть с одинаковыми наборами переменных состояния и методов, образуют класс.

Класс - это механизм для создания новых типов.

Мы уже говорили о классах и его отличиях от объекта, когда рассматривали понятие объек-

та.

Приведу примерную структуру класса. Она не привязанная к какому-либо языку ООП. Class имя_класса [ от кого унаследован]

{

private:

. . . . . . .

public:

. . . . . . .

protected:

. . . . . . .

}

Сами понимаете, что класс должен иметь уникальное имя. Если он наследован из другого, то надо указать имя родительского(их) класса(ов). Обычно у класса бывают три раздела: private, public, protected. Указание на начало раздела private часто опускается и, если не объявлено начало ни одного из других разделов описания класса, считается, что данные относятся к разделу private.

Методы в классе могут быть объявлены как дружественные (friend) или виртуальные (virtual). Иногда встречается объявление перегружаемых (overload) функций. Каждое из этих понятий более подробно мы рассмотрим отдельно.

Private(частный) раздел описания класса обычно находится вначале описания класса и содержит данные, доступ к которым закрыт из внешнего мира. Это и есть та самая "строго охраняемая" зона класса, доступ к которой можно получить только из методов самого класса. Она скрыта от внешнего мира глухой непробиваемой стеной и доступ к данным раздела private обеспечивается только с помощью, специально описанных в других разделах, методов. Скрытые в этом разделе данные также не доступны для всех производных классов.

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

ЛЕКЦИИ

8

бы все наши старания по скрытию и защите данных. По этой причине, производные (наследуемые) классы автоматически не получают доступ к данным родительского класса (раздел private). Но бывают такие случаи, когда необходимо автоматически наследовать некоторые данные из родительского класса так, чтобы они вели себя так, как будто они описаны в производном классе . Именно для этих целей и существует раздел protected(защищенный) описания класса.

Protected(защищенный) - раздел описания класса содержит данные и методы, доступ к которым закрыт из внешней среды, но они напрямую доступны производным классам.

Таким образом, раздел protected используется для описания данных и методов, которые будут доступны только из производных классов. А в производных классах эти данные и методы воспринимаются, как если бы они были описаны в самом производном классе.

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

И последнее, при указании базового(родительского) класса в описании класса в некоторых языках ( к примеру, С++) требуется указать ключевое слово public. Указание этого ключевого слова позволит получить свободный доступ ко всем методам класса, как если бы они были описаны в самом производном классе. В противном же случае, мы не сможем получить доступ к методам родительского класса.

Пример описания наследования классов на С++:

class A

{

. . . . .

}

class B : public A

{

. . . . .

}