Лабораторная работа №1

Вид материалаЛабораторная работа

Содержание


Отношения между классами: агрегация, обобщение, зависимость
2. Содержание работы
3. Методические указания
4. Контрольные вопросы
1. Цель работы
3. Методические указания
4. Контрольные вопросы
Подобный материал:
1   2   3

5. Контрольные вопросы


1. Какие типы контейнеров вы знаете, чем они отличаются друг от друга?

2. Что такое открытое хеширования, как его реализовать?

3. Что такое состояние объекта, чем оно определяется?

4. Что такое поведение объекта, посредством чего оно реализуется?

5. Какие виды типичных операций над объектами вы можете назвать?

6. Каким образом могут создаваться объекты?

7. Для чего используется ключевое слово explicit?

8. Что такое инициализатор конструктора, в каких случаях его использование обязательно?

9. Что такое сво­бодная подпрограмма?

10. Что такое идентичность объекта?

11. Что такое структурная зависимость, какие проблемы она порождает?

12. Что такое конструктор копирования, какие проблемы могут возникнуть при использовании конструктор копирования, предоставляемого по умолчанию?

13. Какие проблемы могут возникнуть при использовании оператора присва­ивания, предоставляемого по умолчанию?

14. Что такое связь?

15. Что такое агрегация (отношение между объектами)?


Лабораторная работа №4


^ ОТНОШЕНИЯ МЕЖДУ КЛАССАМИ: АГРЕГАЦИЯ, ОБОБЩЕНИЕ, ЗАВИСИМОСТЬ


1. Цель работы


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


^ 2. Содержание работы


1. Ознакомиться с отношениями между классами: агрегацией, обобщением (наследованием), зависимостью (использованием), а также с механизмом позднего связывания.

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

– абстрактный класс «Фигура», содержащий чисто виртуальные функции;

– класс «Закрашенный», позволяющий задать параметры закраски и осуществить закраску;

– класс «Фигура-контур» потомок класса «Фигура» (на основе класса, разработанного в лабораторной работе №2);

– класс «Закрашенная фигура» потомок класса «Фигура-контур», класс «Закрашенный» при этом использовать либо как второго родителя (множественное наследование), либо как часть класса «Закрашенная фигура» (агрегация);

– класс «Комбинированная фигура», реализующий две вложенные фигуры, с закраской между ними.

Реализацию классов поместить в отдельный файл.

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

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

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

5. Защитить лабораторную работу, ответив на вопросы преподавателя.


^ 3. Методические указания


Ассоциация – смысло­вая связь. По умолчанию, она не имеет направления и не объясняет, как классы общаются друг с другом. Мы можем только отметить семантическую зависимость, указав, какие роли играют классы друг для друга.

Кратность (мощность) ассоциации – это количество ее участников. Различают три случая кратности ассоциации:

– один-к-одному;

– один-ко-многим;

– многие-ко-многим.

Класс может иметь ас­социацию с самим собой. Такая ас­социация называется рефлексивной.

Агрегация является частным случаем ассоциации. Отношение агрегации между классами имеет непосредственное отношение к агрегации между их экземплярами.

Композиция – форма агрегирования, в которой целое владеет своими частями, имеющими одинаковое с ним время жизни. Части с нефиксированной кратностью могут быть созданы после создания агрегата, но, будучи созданными, живут и умирают вместе с ним. Такие части могут также быть явно удалены перед уничтожением агрегата. В случае композитного агрегирования объект в любой момент времени может быть частью только одного композита.

Обобщение (наследование) – это такое отношение между классами, когда один класс повторяет структуру и поведение другого класса (одиночное наследование) или других классов (множественное наследование).

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

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

У класса обычно бывает два вида клиентов: экземпляры классов и подклассы. Часто полезно иметь для них разные интерфейсы. В частности, мы хотим показать только внешне видимое поведение для клиентов-экземпляров, но нам нужно открыть служебные функции и представления клиентам-подклассам.

Для этой цели описание класса разделяется на три части:

– открытую (public), видимую всем клиентам;

– защищенную (protected), видимую самому классу, его подклассам и друзь­ям (friend);

– закрытую (private), видимую только самому классу и его друзьям.

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

Если при определении класса объявить его суперкласс как private, это будет означать, что, наследуя структуру и поведение суперкласса, подкласс уже не будет его под­типом. Открытые и защищенные члены суперкласса станут зак­рытыми членами подкласса, и, следовательно, они будут недоступны подклассам более низкого уровня. В этом случае подкласс и суперкласс обладают несовместимыми интер­фейсами с точки зрения клиента.

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

Присвоение объекту А значения объекта В в языке С++ до­пустимо, если тип объекта В совпадает с типом объекта А или является его подтипом.

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

Рассмотрим две проблемы, которые возникают при множественном наследовании: конфликт имен между суперклассами и повторное наследование.

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

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

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


^ 4. Контрольные вопросы


1. Ассоциация:

а. Что такое ассоциация?

б. Что такое кратность ассоциации? На какие типы делятся ассоциации в связи с понятием кратности?

в. Что такое рефлексивная ассоциация?


2. Агрегация:

а. Что такое агрегация (отношение между классами)?

б. Что такое композиция?


3. Наследственная иерархия:

а. Что такое обобщение?

б. Что такое виртуальная и чисто виртуальная функция?

в. Какие классы называют конкретными, абстрактными?

г. Какой класс называют базовым, листовым?

д. Для чего вводится защищенная часть класса?


4. Наследование и типизация:

а. Что такое открытое (public) наследование?

б. Что такое закрытое (private) наследование?

в. Что такое защищенное (protected) наследование?

г. Допустимо ли присваивание объекту класса-родителя значения класса-потомка? Если да, то каким образом оно реализуется?

д. Допустимо ли присваивание объекту класса-потомка значения класса-родителя? Если да, то каким образом оно реализуется?

е. Что такое чистый полиморфизм?

ж. Что такое повышающее приведение?

з. Что такое понижающее приведение?


5. Множественное наследование:

а. Что такое множественное наследование?

б Что такое конфликт имен?

в. Что такое повторное наследование?

г. Что такое ромбовидная структура наследования?

д. Что такое виртуальный базовый класс, как он реализуется на С++?


6. Что такое зависимость?


Лабораторная работа №5


ШАБЛОНЫ


^ 1. Цель работы


Изучить понятия шаблона, инстанцирования.


2. Содержание работы


1. Ознакомиться с понятиями шаблона, инстанцирования.

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

2.1. Преобразовать класс-контейнер, разработанный в лабораторной работе №3, в шаблон, так чтобы элементами контейнеров могли быть различные классы, разработанные в лабораторной работе №4 (при различном инстанцировании шаблона).

2.2. Разработать функцию, демонстрирующую поведение разработанного шаблона: провести инстанцирование шаблона для каждого из классов-фигур, продемонстрировать их функционирование.

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

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

5. Защитить лабораторную работу, ответив на вопросы преподавателя.


^ 3. Методические указания


Шаблон служит для построения других классов и может быть пара­метризован другими классами, объектами или операциями. Использование шаблонов реализует в языке С++ особый тип полиморфизма – параметрический полиморфизм.

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

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

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

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

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

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

В C++ пакеты классов реализуются с помощью введения пространств имен – namespace. Однако пространство имен позволяет реализовать более широкое понятие. Оно может включать в себя классы, другие пространства имен, свободные подпрограммы и глобальные (внутри пространства имен) данные. Обращение к членам пространства имен осуществляется с использованием явной квалификации. С другой стороны, описание using в пользовательском коде позволяет не использовать все время явную квалификацию.


^ 4. Контрольные вопросы


1. Что такое шаблон класса, как его описать на С++?

2. Что такое инстанцирование, как его описать на С++?

3. Что такое шаблон функции, как его описать на С++?

4. Каково назначение статической переменной в языке С++?

5. Каково назначение статической функции в языке С++?

6. Что такое утилита, как ее реализовать на С++?

7. Что такое интерфейс? Как его можно описать на С++?

8. Какие отношения могут существовать между интерфейсами, между интерфейсом и классом?

9. Что такое пакет, как его описать на С++?

10. Что такое пространство имен в языке С++?


Литература

  1. Ахо А.В., Хопкрофт Дж.Э., Ульман Дж.Д. Структуры данных и алгоритмы. – М.: Издательский дом «Вильямс», 2000.
  2. Буч Г. Объектно-ориентированный анализ и проектирование с примерами приложений на С++. – М.: "Издательство Бином", СПб.: "Невский диалект", 1998.
  3. Крячков А.В., Сухинина И.В., Томшин В.К. Программирование на С и С++. Практикум. – М.: Горячая линия – Телеком, 2000.
  4. Лисицин Д.В. Объектно-ориентированное программирование: Конспект лекций. – Новосибирск: Изд-во НГТУ, 2001.
  5. Павловская Т.А. C/C++. Программирование на языке высокого уровня.– СПб.: Питер, 2006.
  6. Подбельский В.В. Язык С++: Учеб. пособие. – М.: Финансы и статистика, 2004.
  7. Пол А. Объектно-ориентированное программирование на С++. – СПб.; М.: "Невский диалект" – "Издательство Бином", 1999.
  8. Фридман А.Л. Основы объектно-ориентированного программирования на языке С++. – М.:Горячая линия – Телеком, 2001.
  9. Хабибуллин И.Ш. Программирование на языке высокого уровня. C/C++. – СПб.: БХВ-Петербург, 2006.