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

Карасев Н.И.

Методология объектно-ориентированного программирования

Обзорные лекции по курсу

Лекция 6. Классы и объекты. Структура классов. Наследование классов

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

Функции-члены можно разбить на ряд категорий: функции для чтения и возврата значений закрытых данных-членов класса; функции для установки значений закрытых данных-членов; функции, реализующие функциональные возможности класса; функции для выполнения вспомогательных операций: задание начальных значений объектам класса, присваивания объектам класса, преобразования между классами и встроенными типами или между классами и другими классами, выделение памяти для объектов класса.

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

Содержание лекции:

1.Концепции и методология объектно-ориентированного программирования

2. Классы. Конструкторы и деструкторы

3. Простое и множественное наследование

4.Резюме

5. Упражнения для самопроверки

1.Концепции и методология объектно-ориентированного программирования

Для реализации основополагающих концепций Объектно-ориентированного программирования в языке C++ используются классы. Напомним, что понятием класс определяется группа однотипных объек­тов. При этом каждый представитель (или экземпляр) класса назы­вается объектом. Каждый объект всегда имеет свое, уникальное состояние, определяемое текущими значениями его данных-членов (элементов-данных). Функциональное назначение класса определя­ется возможными действиями над объектами класса, которые зада­ются его функциями-членами (функциями-элементами или метода­ми). В каждом классе распределяется память для хранения данных, и устанавливаются допустимые опера­ции для каждого объекта данных данного типа. Создание объектов данного класса производится специальной функцией-членом, кото­рая называется конструктором, а уничтожение — другой специаль­ной функцией-членом, которая называется деструктором. Класс позволяет делать недоступными внутренние данные, представляя их как открытые (public), закрытые (private) и защищенные (protected). Класс устанавливает четко определенный интерфейс для взаимодействия объектов этого типа с остальным миром. Закры­тые коды или данные доступны только внутри этого объекта. С дру­гой стороны, открытые коды и данные, несмотря на то, что они за­даны внутри объекта, доступны для всех частей программы. Откры­тая часть объекта как раз и используется для создания интерфейса объекта с остальным миром. Полученными объектами можно управлять при помощи сообщений (или запросов), которые пред­ставляют собой просто вызовы функций-членов. Мы будем пользо­ваться термином запрос, чтобы не путать это понятие с сообщения­ми операционной системы Windows.

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

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

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

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

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

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

Соседние файлы в папке ЛекцииКарасева