- •Министерство образования российской федерации Воронежский государственный технический университет а.Г. Остапенко г.А. Кащенко и.В.Давыдов Морев д.Е.
- •Воронеж 2001
- •Рецензенты: Остапенко г.А.
- •Введение
- •Методы разработки программного обеспечения
- •Подходы к разработке программного обеспечения
- •Планирование разработки программного обеспечения
- •Основные типы языков программирования.
- •Процедурное программирование
- •Функциональное программирование
- •Логическое программирование
- •Объектно-ориентрованное программирование
- •Процедуры.
- •Модули.
- •Абстрактные типы данных.
- •Построение программного обеспечения по объектно-ориентированной методике
- •2.1. Функционирование объектно-ориентированного программного обеспечения
- •2.2. Классы. Отношения между классами
- •Этапы построения программного обеспечения
- •2.4. Объектно-ориентированный анализ
- •Информационные модели
- •Жизненные циклы
- •Модели процессов
- •2.5. Нотация для объектно-ориентированного проектирования
- •2.6. Объектно-ориентированное проектирование – ood
- •2.7. Заключительное замечание
- •Основные недостатки:
- •3. Средства объектно-ориентированного программирования
- •Средства объектно-ориентированного рограммирования Turbo-Pascal
- •Понятие “объект”
- •Статические и виртуальные методы. Полиморфизм Статические методы
- •Виртуальные методы. Полиморфизм
- •Конструкторы и деструкторы
- •3.1.5. Сравнимость данных типа объект
- •3.1.6. Динамический вызов объектов
- •3.2. Средства объектно-ориентированного
- •Понятие “класс”
- •Компоненты классов. Доступ к ним.
- •Дружественные функции
- •Конструкторы и деструкторы
- •Статические члены классов
- •3.2.6. Перегрузка операций
- •3.2.7. Виртуальные функции
- •3.2.8. Динамическое создание объектов
- •3.2.9. Проверьте свои знания!
- •Литература:
- •Оглавление
- •Воронежский государственный технический университет,
- •394026 Воронеж, Московский просп. 14
Понятие “объект”
Объект объединяет в себе описание данных и программ их обработки. Программы, включаемые в объекты, могут быть реализованы в виде:
Процедур;
Функций;
Конструкторов;
Деструкторов;
В литературе по ООП принято называть программы в составе объекта методами. Таким образом:
объект = данные + методы
Объекты в Turbo Pascal должны быть описаны в разделе типов. В разделе описания переменных задаются экземпляры объектов или, другими словами, переменные типа объект. Разница между описанием объекта как типа и описанием переменной типа “объект” аналогична соотношению тип – переменная для других данных.
Рассмотрим простейший объект:
Type
Location=object
X,Y:integer;
Procedure Init(NewX,NewY:integer);
End;
Procedure Location.Init(NewX,NewY:integer);
Begin
X:=NewX; {поле Х объекта Location}
Y:=NewY; {поле Х объекта Location}
End;
Для описания объектов используется ключевое слово object; внешне описание объекта подобно описанию записей. Объект Location в качестве данных включает в себя две переменных целого типа X и Y и один метод, заданный процедурой Init. Переменные NewX и NewY являются формальными параметрами процедуры Init, а не данными объекта. Тексты методов задаются за пределами объектов, поэтому в описании необходимо уточнить к какому объекту они относятся. В нашем случае необходимо писать Location.Init. Location – это тип и непосредственно выполнять с ним операции невозможно. Можно ввести переменную
Var
MyLoc:Location;
После этого описания допустимо MyLoc.Init(18,32) т.е. – инициализация объекта путём вызова процедуры Init экземпляра объекта MyLoc, в результате которой переменные X,Y экземпляра объекта MyLoc получат значения 18 и 32. Каждый экземпляр объекта имеет собственные поля памяти для всех переменных и передача между ними значений по умолчанию не происходит. Допускается прямое обращение к переменным объекта. В нашем примере выполнение одного из следующих двух вариантов программы дало такой же результат, как вызов процедуры MyLoc.Init
MyLoc.X:=18;
MyLoc.Y:=32;
With MyLoc Do begin
X:=18;
Y:=32;
End;
Методика ООП не рекомендует прямые обращения к данным. Данные объектов желательно обрабатывать только методами того же объекта.
Свойства ООП
Характерные свойства ООП:
Инкапсуляция (упрятывание);
Наследование;
Полиморфизм.
Инкапсуляция – сочетание данных с процедурами и функциями для их обработки в новый тип – объект.
Наследование – определение объекта с последующим формированием иерархической структуры из подчинённых ему объектов. Каждый подчинённый объект имеет доступ к данным, процедурам и функциям вышестоящего объекта.
Полиморфизм – в вышестоящем и подчинённом объектах могут быть процедуры (функции) с одним именем, но разными реализациями. Каждый объект использует свою реализацию. Полиморфизм рассмотрим в следующем параграфе.
Как было сказано выше, согласно методике ООП нежелательны прямые обращения к данным, особенно с целью изменения их значений. Данные объекта должны обрабатываться методами. Это и есть инкапсуляция. Кроме того, детали реализации методов несущественны для пользователей. С помощью описателя Private можно часть данных и методов объекта сделать недоступными извне:
Type
NewObject = object
Public
описание данных {открытая часть}
описание методов {открытая часть}
Private
описание данных {закрытая часть}
описание методов {закрытая часть}
end;
К закрытым данным и методам могут иметь доступ только другие методы этого же объекта.
Наследование реализуется путём указания в описании объекта имени его объекта – предшественника (только одного), таким образом, допускается только древовидная структура. Рассмотрим это на примере.
Type
Location = object
X,Y:integer;
Procedure Init(InitX,InitY:integer);
Function GetX:integer;
Function GetY:integer;
End;
Point = object (Location) {задано имя предшественника}
Visible:Boolean;
Procedure Init(InitX,InitY:integer);
Procedure Show;
Procedure Hide;
Function IsVisible:Boolean;
Procedure MoveTo(NewX,NewY:integer);
End;
Объект Point имеет три поля данных X, Y, Visible. Функции GetX, GetY возвращают текущее значение X, Y. Процедура Show делает точку с заданными координатами видимой, процедура Hide “гасит” точку; функция IsVisible показывает, видима точка или нет. Фрагмент программы показывает точку Х с координатами (0,0):
Var AP:Point;
. . . .
With AP Do
Begin
Init (0,0);
Show;
End;
При создании древовидных структур объектов важно иметь в виду, что недопустимо повторно объявлять в подчинённом объекте данные объекта-предшественника, независимо от того, меняются при этом их атрибуты или нет. Переопределение методов допускается. Если одному и тому же имени в связанных между собой объектах соответствуют разные методы, то вызов осуществляется в зависимости от того, с каким объектом работают.
Продолжим начатый пример (в принципе, число уровней иерархии не ограничено). Приведём методы объявленных выше объектов.
Procedure Location.Init(InitX,InitY:integer);
Begin
X:=InitX;
Y:=InitY;
End;
Function Location.GetX:integer;
Begin
GetX:=X;
End;
FunctionLocation.GetY:integer;
Begin
GetY:=Y;
End;
Procedure Point.Init(InitX,InitY:integer);
Begin
Location.Init(InitX,InitY);
End;
Procedure Point.Show;
Begin
PutPixel(X,Y,GetMaxColor);
Visible:=true;
End;
Procedure Point.Hide;
Var
TempColor:Word;
Begin
Visible:=false;
Graph.PutPixel(X,Y,GetBkColor);
End;
Function Point.IsVisible:Boolean;
Begin
IsVisible:=Visible;
End;
Procedure Point.MoveTo(NewX,NewY:integer);
Begin
Hide;
X:=NewX;
Y:=NewY;
Show;
End;
Новый объект
Type
Circle = object(Point)
Radius:integer;
Procedure Init(InitX,InitY:integer;InitRadius:integer);
Procedure Show;
Procedure Hide;
Procedure Expand(ExpandBy:integer);
Procedure MoveTo(NewX,NewY:integer);
Procedure Contract(ContractBy:integer);
End;
Procedure Circle.Init(InitX,InitY:integer; InitRadius:integer);
Begin
Point.Init(InitX,InitY);
Radius:=InitRadius;
End;
Procedure Circle.Show;
Begin
Visible:=true;
Graph.Circle(X,Y,Radius); {рисовать круг}
End;
Procedure Circle.Hide;
Var
TempColor:Word;
Begin
TempColor:=Graph.GetColor;
Graph.SetColor(GetBkColor);
Visible:=false;
Graph.Circle(X,Y,Radius);
Graph.SetColor(TempColor);
End;
Procedure Circle.Expand (ExpandBy:integer);
Begin
Hide;
Radius:=Radius + ExpandBy;
If Radius < 0 Then Radius:=0;
Show;
End;
Procedure Circle.Contract(ContractBy:integer);
Begin
Expand(-ContractBy);
End;
Procedure Circle.MoveTo(NewX,NewY:integer);
Begin
Hide;
X:=NewX;
Y;=NewY;
Show;
End;
Рассмотрим использование описанных объектов
Var
Gd,Gm:integer;
P1:Point;
C1:Circle;
Begin
{инициализация графического режима}
Gd:=Detect;
Graph.InitGraph(Gd,Gm,’’);
If GraphResult <> grOK then Halt(1);
{---------------------------------------------}
P1.Init(50,60); {показать точку}
P1.Show; {с координатами (50,60)}
ReadLn;
C1.Init(50,60,30); {показать окружность}
С1.Show; {с центром в точке (50,60) радиус30}
ReadLn;
P1.Hide; {погасить точку – центр окружности}
ReadLn;
With C1 Do begin {выполнение действий с переменной С1 типа объект Circle}
MoveTo(90,110); {передвигать окружность на новое место радиус прежний}
ReadLn;
Expand(60); {изменить радиус окружности}
End;
ReadLn;
End.
Статические и виртуальные методы.
Полиморфизм.
В языке Turbo Pascal имеются два типа методов статические и виртуальные. Статические методы менее сложные, требуют меньше памяти и выполняются быстрее, однако не позволяют реализовать все преимущества ООП. Используемые в приведённых выше программах методы – статические, т.е. если тип метода не указан, то он считается статическим.