
- •Объектно-ориентированное программирование
- •Оглавление
- •Введение
- •1. Краткие теоретические сведения
- •1.1. Технология разработки больших программных комплексов
- •1.2. Основные принципы модульного программирования
- •1.3. Объектно-ориентированная методология разработки программ
- •2. Пример объектно-ориентированного программирования
- •2.1. Формулировка задачи
- •2.2. Проектирование структуры объектов
- •2.3. Проектирование методов объектов
- •2.4. Реализация программы
- •2.5. Модификация программы
- •3. Программирование в визуальной среде delphi
- •4. Курсовая работа «объектно-ориентированное программирование»
- •4.1. Основные этапы выполнения курсовой работы.
- •4.2 Варианты курсовой работы
- •5. Литература
- •Объектно-ориентированное программирование
1.3. Объектно-ориентированная методология разработки программ
Объектно-ориентированное программирование (ООП) является более структурным, чем все предыдущие разработки, касающиеся структурного программирования. Оно также является более модульным и более абстрактным, чем предыдущие попытки абстрагирования данных и переноса деталей программирования на внутренний уровень. Объектно-ориентированное программирование – это методология программирования, которая основана на представлении программы в виде совокупности объектов, каждый из которых является реализацией определенного класса (типа особого вида), а классы образуют иерархию на принципах наследуемости. В основе ООП лежит идея объединения в одной структуре данных и действий, которые производятся над ними. Объект – структура, компонентами которой являются взаимосвязанные данные различных типов и использующие эти данные процедуры и функции. Данные называют полями объекта, а процедуры и функции объекта его методами. Логическая структура объекта приведена на рис. 1.1.
a : T1 |
b : T2 |
………. |
d : Tn |
адр. процедуры Р1 |
адр. функции F2 |
…………………….. |
адр. процедуры Рm |

О – поля – определяют свойства
объекта и их текущие значения
О – методы
– определяют
совокупность
допустимых
действий над О -
полями
Рис. 1.1 Логическая структура объекта.
Описание объектного типа выглядит следующим образом:
Type TO = Object
а : T1;
b : T2;
……
d : Tn;
Procedure P1 ( …….. );
Function F2 (………) : Tk;
……………………………
Procedure Pm(………);
End;
Var O : TO; {О - переменная объектного типа называется экземпляром}.
Основные преимущества ООП:
1. В максимальной степени изолируется объект от внешнего окружения, что обеспечивает его независимость и скрытие информации внутри него. Отметим, что существующие ранее в языках программирования только такие синтаксические конструкции, как процедура и функция, не могли обеспечить надежного скрытия информации, поскольку подвержены влиянию глобальных переменных, поведение которых в сложных программах зачастую бывает трудно предсказуемым.
2. Повышается надежность программы, так как обмен данными с другими объектами и программой тщательно контролируется.
3. Модификация алгоритмов и данных объекта не влечет за собой плохо прослеживаемых связей.
ООП базируется на 3-х основных понятиях:
- инкапсуляция;
- наследование;
- полиморфизм.
Инкапсуляция – объединение информационных полей и методов, которые выполняют над ними действия, в единый объект. При этом данные и процедуры их обработки теряют самостоятельное значение.
Наследование – такое отношение между объектами, когда один объект повторяет структуру и поведение другого. Используется для иерархического упорядочения объектов. В модульном подходе сложный объект просто делится на части. Например, иерархическое описание такого сложного объекта как животное может быть осуществлено после его декомпозиции на части (рис. 1.2). При объектно-ориентированной методологии декомпозиция может быть осуществлена по принципу наследования свойств объекта (рис. 1.3, 1.4).
Правила наследования:
1. Доступ к О-полям и О-методам родительских типов точно такой же, как если бы они были описаны в самом потомке.
2. Идентификаторы О-полей потомка не должны совпадать с идентификаторами О-полей родительских типов. Если в потомке описывается О-метод с тем же именем, что и у родителя, то он перекрывает (подавляет) его.
3. Любое изменение текста в родительском О-методе автоматически оказывает влияние на все О-методы порожденных типов, которые его вызывают.
Полиморфизм – свойство родственных объектов решать схожие по смыслу проблемы разными способами. Например, если абстрактный объект Фигура (рис. 1.5) обладает методом Draw прорисовки её на экране монитора, то все потомки типа Фигура могут иметь собственные методы Draw, перекрывающие аналогичный метод родителя.
Таким
образом, изменяя алгоритм О-метода в
потомках можно придавать этим потомкам
специфические свойства, отсутствующие
у родителя. В результате в О-родителе и
О-потомке будут действовать два
одноименных О-метода, имеющие разную
алгоритмическую основу – следовательно
придающие объектам разные свойства –
это и есть полиморфизм.
Переопределение методов родителя может осуществляться с помощью статических методов и динамических методов. Рассмотрим их отличие на примере простой ООП-программы.
Program OOP_Primer;
Uses CRT, Graph;
Type TFigure = Object
x, y :Integer; { координаты фигуры}
color :Word; { и её цвет}
Procedure Init ( ax, ay :Integer; col :Word );
Procedure Draw ( col :Word );
Procedure Show;
Procedure Hide;
Procedure MoveTo ( dx, dy :Integer );
End;
TPoint = Object ( TFigure ) { TFigure – имя родительского типа }
Procedure Draw ( col :Word );
End;
TCircle = Object ( TPoint )
R :Integer; { радиус окружности }
Procedure Init (ax,ay,aR :Integer; col :Word );
Procedure Draw ( col :Word );
End;
{Реализация методов TFigure}
Procedure TFigure. Init ( ax, ay :Integer; col :Word ); { инициализация фигуры }
Begin x := ax; y := ay; color := col; End;
Procedure TFigure. Draw ( col :Word ); { рисование фигуры }
Begin {ничего не делает, потомки должны перекрывать этот метод} End;
Procedure TFigure. Show; { рисование фигуры цветом color}
Begin Draw ( Color ); End;
Procedure TFigure. Hide; {стирание фигуры }
Begin Draw ( GetBkColor ); End;
Procedure TFigure. MoveTo ( dx, dy :Integer ); { перемещение фигуры }
Begin Hide; x := x+dx; y := y+dy; Show; End;
{ реализация методов TPoint }
Procedure TPoint. Draw ( col :Word ); { рисование точки }
Begin PutPixel ( x, y, col ); End;
{ реализация методов TCircle }
Procedure TCircle. Init (ax,ay,aR :Integer; col :Word );
{ инициализация окружности }
Begin Inherited Init ( ax, ay, col ); R := aR; End;
Procedure TCircle. Draw ( col :Word ); { рисование окружности }
Begin SetColor ( col ); Circle ( x, y, R ); End;
{ $I GrInit }
Var VCircle : TCircle;
Begin
GrInit;
VCircle. Init ( 320, 240, 100, 12 );
VCircle. Show;
ReadKey;
CloseGraph;
End.
Хотя
эта программа составлена синтаксически
правильно и должна нарисовать окружность
на экране, в действительности этого не
будет. Дело в том, что вызовы методов и
их связи установлены статически на
этапе трансляции и в дальнейшем не
изменяются. Поэтому, при выполнении
методаVCircle.
Show
будет вызываться метод TFigure.
Draw,
а не метод TCircle.
Draw.
Связи между методами в этой программе
показаны на рис. 1.6.
При использовании статических методов транслятор выполняет следующие действия по связыванию О-методов:
1. Устанавливает тип объекта, вызывающий данный О-метод.
2. Производит поиск О-метода в рамках данного типа. Если О-метод найден, то назначается вызов этого О-метода, иначе выполняется п.3.
3. Продолжает поиск О-метода в прародительских типах вверх по иерархии. Если поиск успешен, то назначается вызов, иначе – ошибка.
Из этого следует вывод: если О-метод прародителя вызывает другие методы, то они будут методами прародителя, даже если потомки имеют собственные подобные методы.
Объект VСircle имеет собственный метод Draw, однако его унаследованный метод Show жестко (статически) связан с методом Draw объектного типа TFigure, который ничего не рисует. Конечно, можно снабдить всех потомков собственными статическими методами Show и Hide, однако в объектно-ориентированном программировании реализуется более эффективный подход – механизм позднего связывания и виртуальные методы.
Таким образом, для реализации полиморфизма в языке программирования требуются не статическое, а динамическое (во время выполнения программы) связывание экземпляров объектов с методами, которые поддерживают полиморфические действия.
Виртуальные методы (V-методы).
1. Реализуют свойство полиморфизма объектов.
2. Если О-метод объявлен виртуальным, то все потомки должны описываться виртуальными (т.е. статический метод никогда не может подавить виртуальный).
3. V-метод в заголовке содержит директиву Virtual, например:
Procedure P1 (……………..); Virtual;
4. Если V-метод переопределяется у потомков, то заголовок (имя, порядок, тип и количество параметров) не должны изменяться. Иначе у статических методов – у них можно изменять формальные параметры.
5. Каждый О-тип, имеющий V-методы, обязан иметь Constructor инициализирующий экземпляр объекта. Constructor – специальный тип процедуры, который выполняет начальные установки для работы механизма V-методов. Каждый отдельный экземпляр объекта должен быть инициализирован отдельным вызовом Constructor’a. При этом Constructor устанавливает связь экземпляра с таблицей виртуальных методов VMT. Constructor всегда вызывается до первого вызова V-метода. Сам Constructor статический, хотя может содержать вызовы V-методов.
6. Каждый О-тип, содержащий V-методы, имеет свою таблицу VMT. Структура VMT и ее взаимодействие с объектами и V-методами приведена на рис. 1.7.
Таблица VMT служит для передачи управления тому методу, который соответствует вызову определенного объекта. По сути VMT является таблицей адресов для косвенного перехода. При этом каждый из методов не является какой-то независимой процедурой или функцией Паскаля – любой из методов может вызываться только из какого-либо объекта, причем при каждом таком вызове в метод всегда передается невидимый адрес (SELF) вызывающего объекта, поэтому метод будет работать с полями того объекта, который его вызвал. VMT создается одна для каждого О-типа (но не экземпляра). При передаче в процедуру или функцию полиморфного объекта, имеющего V-методы, передается и таблица VMT. Это гарантирует, что сработают именно те методы, которые подразумевались при вызове.
Рассмотрим работу программы рисования различных фигур после придания ей полиморфических свойств.
Program OOP_Primer;
Uses CRT, Graph;
Type TFigure = Object
x, y :Integer; { координаты фигуры}
color :Word; { и её цвет}
Constructor Init ( ax, ay :Integer; col :Word );
Procedure Draw ( col :Word ); Virtual;
Procedure Show;
Procedure Hide;
Procedure MoveTo ( dx, dy :Integer );
End;
TPoint = Object ( TFigure ) { TFigure – имя родительского типа }
Procedure Draw ( col :Word ); Virtual;
End;
TCircle = Object ( TPoint )
R :Integer; { радиус окружности }
Constructor Init (ax,ay,aR :Integer; col :Word );
Procedure Draw ( col :Word ); Virtual;
End;
{ реализация методов TFigure }
Constructor TFigure. Init ( ax, ay :Integer; col :Word );
Begin x := ax; y := ay; color := col; End;
Procedure TFigure. Draw( col :Word );
Begin {ничего не делает, потомки должны перекрывать этот метод} End;
Procedure TFigure. Show;
Begin Draw ( Color ); End;
Procedure TFigure. Hide;
Begin Draw ( GetBkColor ); End;
Procedure TFigure. MoveTo ( dx, dy :Integer ):
Begin Hide; x := x+dx; y := y+dy; Show; End;
{ реализация методов TPoint }
Procedure TPoint. Draw( col :Word );
Begin PutPixel ( x, y, col ); End;
{ реализация методов TCircle }
Constructor TCircle. Init;
Begin Inherited Init ( ax, ay, col ); R := aR; End;
Procedure TCircle. Draw( col :Word );
Begin SetColor ( col ); Circle ( x, y, R ); End;
Var VCircle : TCircle;
{ $I GrInit }
Begin
GrInit;
VCircle. Init ( 320, 240, 100, 12 );
VCircle. Show;
ReadKey;
CloseGraph;
End.
В этом варианте программа нарисует на экране окружность. Действительно, при работе метода VCircle. Init Constructor создаст таблицу VMT для типа TСircle и экземпляр VCircle установит с ней связь. При вызове метода Show из объекта VCircle последует передача управления унаследованному методу TFigure. Show, причем следует иметь ввиду два момента:
1. Связь с методом TFigure. Show из головной программы установлена статически (во время трансляции).
2. При вызове этого метода в качестве невидимого фактического параметра передается адрес объекта VCircle, который в свою очередь имеет связь с VMT типа TCircle.
Связь с виртуальным методом TCircle.Draw осуществляется путем косвенного перехода через таблицу VMT объектного типа TCircle, которая и рисует окружность. Аналогично будет работать механизм связи с виртуальными методами, если в описанную иерархию фигур добавлять новые фигуры со своими виртуальными методами Draw.
Все приведенные до сих пор экземпляры объектов были статического типа (не путать со статическими методами!), они описывались зарезервированным словом Var, им присваивались имена, и сами объекты размещались в сегменте данных или в стеке. Но точно так же, как и любые типы данных в Паскале, объекты можно размещать в динамической памяти и работать с ними, применяя указатели. Паскаль включает несколько усовершенствованных процедур для размещения и удаления объектов из памяти наиболее эффективными способами. Подробное их рассмотрение выходит за рамки данных методических указаний и предлагается изучить самостоятельно, например, по работам [1,2]. Отметим только, что Паскаль предоставляет специальный тип метода Destructor, называемый «сборщиком мусора» или деструктором, для очистки и удаления динамических методов. Деструктор объединяет этап удаления объекта с другими действиями, необходимыми для данного типа объекта. Деструктор размещается вместе с другими методами объекта в определении типа объекта. В приведенных ниже примерах используются только статические объекты, поэтому непосредственной необходимости в деструкторах нет. Тем не менее, они присутствуют в методах объектов для полноты картины и выполняют некоторые завершающие действия в программе.