
Астраханский государственный
университет
Кафедра Информационных систем
курс
"Объектно-ориентированное программирование"
Астрахань 2012
Содержание.
"Объектно-ориентированное программирование" 1
Астрахань 2012 2
ВВЕДЕНИЕ 4
1. ИНКАПСУЛЯЦИЯ 4
Лабораторная работа №1 8
2. НАСЛЕДОВАНИЕ 8
Лабораторная работа №2 13
3.ПОЛИМОРФИЗМ 13
Лабораторная работа №3 26
4. ОСОБЕННОСТИ РЕАЛИЗАЦИИ ОБЪЕКТОВ НА ЯЗЫКЕ ТУРБО ПАСКАЛЬ 26
Лабораторная работа №4 33
СПИСОК ЛИТЕРАТУРЫ 34
Введение
Условно можно считать, что главным достижением в технологии программирования 60-х годов являлось структурное программирование, 70-х - абстрактные типы данных, 80-х - объектно-ориентированный подход. Абстракция данных, типизация и модульность стали основами технологии объектно-ориентированного программирования (ООП), которая уверено лидирует в современном компьютерном мире. Причем наиболее популярны не малоизвестные новые языки (например, новый язык Н.Вирта Оберон, поддерживающий ООП), а объектно-ориентированные расширения уже знакомых пользователю языков, таких как Си или Паскаль.
Расширение языка ТУРБО ПАСКАЛЬ, начиная с версии 5.5, предоставляет все возможности ООП: наибольшую структурность, абстрактность и модульность, встроенные непосредственно в язык. Для усвоения концепций ООП на Паскале достаточно знакомства с такими понятиями данного языка, как основные типы данных, запись, процедура и функция, динамические переменные. Концепция ООП базируется на трех основных понятиях: инкапсуляции, наследовании и полиморфизме.
В настоящее время имеется общирная литература как по базисному языку ПАСКАЛЬ (см., например, прекрасный, на мой взгляд, учебник /1/, а также /2, 7, 10, 12, 18/), так и описание последних версий системы программирования ТУРБО ПАСКАЛЬ (прежде всего /14/, затем /6/). Рассмотренные в данном пособии принципы ООП широко используются и в последней разработке фирмы Borland: системе визуального программирования на языке ПАСКАЛЬ Delphi. Данная система полностью построена на объектно-ориентированной технологии программирования и предназначена для создания приложений на основе ООП. Наряду с моделью объектов, используемых в версии 7.0 ТУРБО ПАСКАЛЯ, вводится новая модель объектов, которые позволяют реализовать визуальную технологию программирования. В данном пособии рассматриваются только принципы ООП, которые справедливы как для старой, так и для новой модели объектов. Более того, так как новая модель объектов является развитием старой, то и знакомство с ООП лучше начинать последовательно, двигаясь от старой модели к новой. Для знакомства с новой моделью объектов можно порекомендовать литературу по системе Delphi (например, /5, 8, 9/).
1. Инкапсуляция
Инкапсуляция - это объединение данных и программ обработки этих данных.
Впервые понятие инкапсуляции было использовано в языках, поддерживающих так называемый абстрактный подход к программированию (например, Модула-2). Основная идея абстрактного подхода заключается в том, чтобы, скрыв от пользователя структуру информации об объекте, дать ему возможность получать необходимые для работы с объектом данные только через процедуры, относящиеся к этому объекту. Такой прием позволяет значительно повысить надежность и мобильность разработанного программного обеспечения. Надежность повышается вследствие того, что все процедуры для работы с данными об объекте относительно просты и прозрачны, а значит, могут быть разработаны более качественно. При изменении структуры данных достаточно переработать только программы, непосредственно связанные с объектом, а более сложные программы, использующие данный объект, изменять не нужно. Данное обстоятельство повышает как надежность, так и мобильности созданных программ. Поясним сказанное на конкретном примере.
Пусть требуется создать программное обеспечение для рисования различных геометрических примитивов: точки, линии, прямоугольника и окружности. В принципе можно ограничиться только библиотекой процедур, которые позволяют нарисовать на экране любой из перечисленных объектов. Фактически библиотекой таких процедур является модуль Graph системы ТУРБО ПАСКАЛЬ. Если использовать абстрактный подход, то необходимо ввести для каждого графического примитива соответствующую ему структуру данных и обрабатывающие эту структуру процедуры (методы объекта). Например, для точки применение абстрактного подхода проиллюстрировано фрагментом 1.1.
К сожалению, язык Паскаль изначально не поддерживал принципы абстрактного программирования, так как во время его создания в 1968-1970 г. г. данных принципов просто еще не было. Однако следующий язык Н.Вирта Модула-2 уже поддерживал абстрактные типы данных. Этим объясняется тот факт, что в приведенном примере реализация абстрактного подхода выглядит довольно громоздко. Но даже в таком виде можно заметить определенные преимущества подхода.
Действительно, чтобы получить информацию о точке необходимо знать только заголовки соответствующих методов точки. Можно не иметь информации о структуре записи Point. Более того, эта структура может от Вас быть преднамеренно скрыта. Доступ к данным, основанный на вызове методов обработки структуры данных Point, независимых от внутреннего представления данных о точке (названия и структуры ее полей). Например, если в будущем более удобным станет хранение координат точки в массиве, то достаточно внести соответсвующие изменения только в методы обработки записи Point, не меняя заголовки этих методов. При этом весь остальной код программы останется без изменений.
Объектно-ориентированный подход заимствовал понятие инкапсуляции у абстрактного подхода, включив новый тип данных - объект. В языке ТУРБО ПАСКАЛЬ для описания этого нового типа используется ключевое слово Object. Описание объектного типа, который можно считать расширением типа Record, включает в себя не только поля данных, но и методы их обработки.
Фрагмент 1.2 содержит реализацию объекта Point с использованием объектно-ориентированного подхода. Для доступа к полям объекта внутри методов объекта не нужен оператор with. Это делается автоматически. Объект “сам знает” все свои данные. Сравните текст программ фрагментов 1.1 и 1.2. Обратите внимание, насколько объектно-ориентированный подход упростил и сделал более прозрачным код программы.
В объекте название метода можно рассматривать как поле данных процедурного типа. Поэтому вызов метода объекта можно выполнить аналогично обращению к полю данных. Например, P.Show или with P do Show Объект Point объявлен в разделе описания типов, так как является фактически новым типом данных. Поэтому для его использования необходимо в разделе описания переменных объявить переменную типа Point, которая называется экземпляром объекта. Например,
VAR Pa,Pb : Point; { переменные Pa и Pb типа Point }
Фрагмент 1.1 USES Graph; TYPE Point = record { структура данных для точки } x,y : integer; Color : word; end; { инициализация точки } procedure PInit(xc,yc: integer;cc: word; var P: Point); Begin with P do begin x:=xc; y:=yc; Color:=cc end; End; { взять параметры точки } function PGetX(var P: Point): integer; Begin PGetX:=P.x; End; function PGetY(var P: Point): integer; Begin PGetY:=P.y; End; function PGetColor(var P: Point): word; Begin PGetColor:=P.Color; End; { нарисовать точку } procedure PShow(var P: Point); Begin with P do PutPixel(x,y,Color); End; { ОСНОВНАЯ ПРОГРАММА } VAR P : Point; Gd,Gm : integer; BEGIN { инициализируем } Gd:=Detect; { графический режим } InitGraph(Gd,Gm,’ ‘); { инициализируем параметры точки } PInit(100,100,White,P); PShow(P); { рисуем точку P } { вывод координат точки } WriteLn(‘X=’,PGetX(P),’ Y=’,PGetY(P)); ReadLn; { ожидание нажатия Enter } END. |
Фрагмент 1.2 USES Graph; TYPE Point = object { объект-точка } x,y : integer; Color : word; procedure Init(xc,yc: integer; cc: word); function GetX: integer; function GetY: integer; function GetColor: word; procedure Show; end; { инициализация точки } procedure Point.Init; Begin x:=xc; y:=yc; Color:=cc End; { взять параметры точки } function Point.GetX; Begin GetX:=x; End; function Point.GetY; Begin GetY:=y; End; function Point.GetColor; Begin GetColor:=Color; End; { нарисовать точку } procedure Point.Show; Begin PutPixel(x,y,Color); End; { ОСНОВНАЯ ПРОГРАММА } VAR P : Point; Gd,Gm : integer; BEGIN { инициализируем } Gd:=Detect; { графический режим } InitGraph(Gd,Gm,’ ‘); { инициализируем параметры точки } P.Init(100,100,White); P.Show; { рисуем точку P } { вывод координат точки } WriteLn(‘X=’,P.GetX,’ Y=’,P.GetY); ReadLn; { ожидание нажатия Enter } END. |
Так как объект - это тип данных, то его можно использовать при описании структурных типов: массивов, записей или новых объектов. Например, массив из 10 элементов типа Point может быть описан следующим образом:
TYPE PType = array [1..10] of Point; VAR Pc, Pd : PType; { 2 массива по 10 точек }
Экземпляры объектов можно описывать как динамические переменные. Для этого достаточно описать тип указателя на объект (фрагмент 1.3):
Фрагмент 1.3
TYPE PointPtr = ^Point; VAR Pa,Pb : PointPtr; BEGIN New(Pa); { выделяем память } Pa^.Init(100,100,LightBlue); { инициализируем точку } Pa^.Show; { рисуем } Dispose(Pa); { освобождаем память } GetMem(Pb,SizeOf(Point)); { выделяем память } Pb^.Init(200,200,LightRed); { инициализируем точку } Pb^.Show; { рисуем } FreeMem(Pb,SizeOf(Point)); { освобождаем память } ... END.
|
Контрольные вопросы |
1. В чем заключается понятие инкапсуляции? 2. Почему абстрактный подход повышает надежность и мобильность программ? 3. Чем отличается объект от экземпляра объекта? 4. Можно ли объект использовать для описания новых типов данных? 5. Можно ли использовать динамические переменные объектного типа? 6. Как можно вызвать метод объекта? 7. Как можно получить доступ к полю объекта? Перечислите достоинства и недостатки различных методов доступа?
|
Лабораторная работа №1 |
|
Набрать текст программы фрагмента 1.2. Выполнить данный пример и просмотреть результат. 2. Модифицировать текст программы фрагмента 1.2, описав массив из 100 точек. Параметры точек инициализировать с использованием генератора случайных чисел. 3. Модифицировать текст программы фрагмента 1.2, включив описание динамического массива из 100 точек. С помощью функции SizeOf определить размер объекта Point. С помощью функции MemAvail проследить корректность выделения и освобождения динамической памяти из хиппа. 4. Разработать объект ЖУК: символ “Ж”, перемещаемый по экрану в текстовом режиме с помощью клавиш со стрелками. 5. Разработать объект СОСУД с одним входом и одним выходом. В сосуде может храниться жидкость. Максимальный объем жидкости в сосуде равен V. При однократном нажатии клавиши “+” происходит наполнение сосуда жидкостью объемом Va. При нажатии клавиши “ “ - слив жидкости объемом Vb. Придумать методы для отображения текущего заполнения сосуда. 6. Построить модель броуновское движение молекул в прямоугольном сосуде. Отдельные молекулы и сам сосуд описать как объекты. 7. Разработать объект КУРСОР в графическом режиме. Управление курсором должно осуществляться нажатием клавиш со стрелками на клавиатуре. 8. Разработать объект ОЧЕРЕДЬ с порядком обслуживания “Первый пришел - первый обслужен”. Объект должен уметь показывать изменение своего состояния на экране. 9. Разработать объект ЗМЕЙКА. Змейка состоит из последовательности символов. Управление головой змейки должно осуществляться нажатием клавиш со стрелками на клавиатуре. 10. Разработать объект ОКНО. Окно имеет прямоугольную форму, заголовок, рамку, умеет сохранять изображение под собой, перемещаться и изменять свои размеры. 11. Разработать объект МЕНЮ. Меню должно управляться клавишами клавиатуры.
12. Разработать объект ЕЖИК.