Файл: Могилев А.В. Информатика.pdf

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 31.03.2021

Просмотров: 6832

Скачиваний: 51

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
background image

 

366 

Объявление  метода  внутри  объявления  объектного  типа  содержит  только  заголовок.  Тело 

метода определяется вне объявления объекта. Его заголовок должен содержать имя объекта, кото-
рому принадлежит метод. Например: 

 

procedure <ТипОбъекта.Метод> 

(<Параметр1>, <Параметр2> : integer); 

begin 
… 
… 
еnd;{Метод} 

 
Методы  подразделяют  на  статические  и  виртуальные.  Виртуальный  метод  отличается  от 

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

Синтаксис виртуального метода: 
 
procedure <Метод> (<Параметр1>, <Параметр2> : integer): virtual; 
 
Кроме  обычных  процедур  и  функций,  ТурбоПаскаль  6.0  реализует  два  специальных  типа 

методов: конструктор и деструктор. 

Конструктор

  -  это  специальный  метод,  инициализирующий  объект,  содержащий  вирту-

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

Деструктор

  -  это  специальный  метод,  освобождающий  память  «кучи»  от  динамических 

объектов. Он объявляется с использованием специально зарезервированного слова destructor. 

Основными отличительными свойствами объекта являются 
• инкапсуляция - объединение записей с процедурами и функциями, работающими с этими 

записями; 

• наследование - задание объекта, затем использование его для построения иерархии поро-

жденных объектов с наследованием доступа каждого из порожденных объектов к коду и данным 
предка; 

• полиморфизм - задание одного

 

имени действию, которое передается вверх и вниз по ие-

рархии  объектов  с  реализацией  этого  действия  способом,  соответствующим  каждому  объекту  в 
иерархии. 

Рассмотрим  смысл  каждого  из  перечисленных  свойств

 

на  примере  построения  на  экране 

дисплея точек разных цветов (звездного неба). 

Инкапсуляция.

 Основой решения задачи является задание положения (позиции) отдельной 

точки  на  экране,  описываемого  координатами  Х  и  Y.  Для  задания  координат  подходит  тип  «за-
пись»: 

 
Pozition = record  
X, Y : integer; 
end; 

 

Далее может быть необходимо задать значения координат (такая процедура носит название 

инициализации). Создадим соответствующую процедуру: 

 
procedure Init(CoordX, CoordY : integer); 
begin 
X : 

=

 CoordX; 


background image

 

367 

Y : = CoordY; 
end; 
 
Затем  потребуется  знание  фактических  значений  координат.  Для  этого  вводим  две  функ-

ции: 

 
function GetX : integer; 
begin  
GetX: = X; 
end; 
function GetY: integer; 
begin  
GetY: = Y; 
end; 
 
По нашему замыслу процедура Init и функции GetX и GetY должны работать только с по-

лями записи Pozition. 

Введение  объектов  позволяет  зафиксировать  это  положение,  объявив  и  поля,  и  действия 

над ними в единой конструкции: 

Pozition = object 

X, Y: integer; 
procedure Init(CoordX, CoordY : integer); 

function GetX : integer; 

function GetY : integer; 
end; 

Процедура Init и функции GetX и GetY являются методами объекта Pozition.  
Для инициализации экземпляра типа Pozition достаточно вызвать его метод, как если бы он 

был полем записи: 

var 

FirstPozition : Pozition; 
… 

FirstPozition.Init(10,15); 

 

Метод задается так же, как и процедура в модуле: внутри объекта записывается заголовок 

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

procedure Pozition. Init(CoordX, CoordY: integer); 
begin 

X: = CoordX: 

Y: = CoordY; 

end; 

 

Заметим, что имена формальных параметров метода не  могут совпадать  с  именами  полей 

данных объекта. 

Также  как  модуль  скрывает  детали  реализации  процедур  от  пользователя,  объект  может 

скрывать свои поля и методы. Для этого используется ключевое слово  private (личный). Личные 
поля и методы доступны только внутри метода. Объявление выглядит следующим образом: 

type 

ObjectName=object  
поле; 


background image

 

368 

… 

поле; 
метод; 

метод; 

private 

поле; 
… 

поле; 
метод; 
… 

метод; 

end; 

 

Наследование

. Рассмотрим точку с координатами Х и Y. Ее можно сделать видимой или 

невидимой,  ей  можно  задать  цвет,  ее  можно  переместить.  Создадим  объект  с  такими  возможно-
стями: 

Point=object 

X,Y : integer; " 
procedure Init(CoordX, CoordY : integer); 
function GetX : integer; 
function GetY . integer; 
Visible: Boolean; 
Color: Word; 
procedure Init(CoordX, CoordY : integer; InitCoIor : Word); 
function Is Visible : Boolean; 
procedure Show;{показывает точку} 
procedure Blind; {стирает точку} 
procedure Jump(NextX, NextY : integer);{nepeMeiuaer точку}  

end; 
 
Заметим, однако, что поля  X.Y и методы  GetX, GetY практически совпадают с соответст-

вующими полями и методами объекта Pozition. 

Турбо-Паскаль предоставляет возможность учесть эту ситуацию. Следует считать тип объ-

екта Point порожденным типом Pozition, записав это следующим образом: 

 

Point=object(Pozition) 

Visible : Boolean; 
Color : Word; 
procedure Init(CoordX, CoordY : integer; InitColor : Word); 
function Is Visible . Boolean; 
procedure Show; 
procedure Blind: 

procedure Jump(NextX, NextY : integer); 

end; 

 

Объект Point теперь наследует свойства объекта Pozition. Поля X,Y явно не заданы в Point, 

но Point ими обладает благодаря наследованию, т.е. можно написать 

 
Point.X:=17; 
 
Смысл объектно-ориентированного программирования заключается в работе с полями объ-

екта через его методы. 


background image

 

369 

Полиморфизм

. Предположим, надо создать объект «кружок». Очевидно, что новый объект 

должен иметь предком объект  Point, обладая всеми его свойствами, кроме того. быть больше по 
размеру.  Однако,  ясно,  что  «высветить»  точку  и  закрашенную  окружность  не  удастся  одними  и 
теми же командами. Турбо-Паскаль разрешает сохранить потомку имя родительского метода, «пе-
рекрывая» его. Чтобы перекрыть родительский метод, надо просто задать его с тем же именем, но 
с другим телом (кодом) и, если необходимо, с другим набором параметров. Такой метод делается 
виртуальным и к его объявлению добавляется слово virtual. Применение виртуальных методов на-
лагает  ограничения  на  процедуры  инициализации,  которые  должны  записываться  с  зарезервиро-
ванным словом constructor и иметь общее имя Init 

Каждый отдельный экземпляр объекта должен инициализироваться с помощью отдельного 

вызова конструктора 

Для  очистки  и  удаления  динамически  распределенных  объектов  существует  специальная 

процедура destructorDone. 

Деструктор комбинирует шаг освобождения памяти в «куче» с некоторыми другими зада-

чами. Метод деструктора может быть пустыу), поскольку работу выполняет не только код тела, но 
и код, генерируемый Турбо-Паскалем в ответ на зарезервированное слово destructor. 

 

9.3. ОБОЛОЧКА TURBO-VISION 

 

Объектно-ориентированный  подход  позволяет  создавать  объектные  среды,  библиотеки 

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

Turbo-Vision - это оболочка для создания оконченных интерфейсов программ в среде Тур-

бо-Паскаль версий 6.0, 7.0. 

Объектно-ориентированная библиотека Turbo-Vision включает 
• многократные перекрещивающиеся окна с изменяемыми размерами; 

/

 

• выпадающие меню; 
• поддержку мыши; 
• встроенную установку цвета; 
• кнопки, полосы скроллинга, окна ввода, зависимые и независимые кнопки; 
• стандартную обработку клавиш и нажатий мышки и многое другое. 
Стандартный отработанный интерфейс, создаваемый с помощью Turbo-Vision, имеет свер-

ху строку меню, а снизу - строку статуса. 

Текст, который появляется в строке статуса, обычно выводит сообщения о текущем состоя-

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

Когда «выпадает» меню. полоса подсветки пробегает по списку элементов меню при дви-

жении  мыши  или  нажатии  на  клавиши  курсора.  Нажатием  клавиши  <Enter>  или  левой  кнопки 
мыши выбирается подсвеченный элемент. Выбранный элемент меню посылает команду в опреде-
ленную часть программы. 

Программа обычно взаимодействует с пользователем через одно или более окон или диало-

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

Диалоговые окна часто содержат кнопки - подсвеченные слова - которые могут активизи-

роваться с помощью мыши (или переходом через клавишу  Tab и нажатием клавиши <Пробел>). 
Отображаемые  слова,  выбранные  мышью,  могут  быть  установлены  для  передачи  команд  в  про-
грамму. 

Простейшая программа на Turbo-Vision выполняет следующие действия: 
• заполняет панель экрана полутеневым шаблоном; 
• выводит на экран полосу меню (наверху) и строку статуса (внизу); 


background image

 

370 

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

бой программы является объект TApplication. TApplication - это абстрактный тип объекта. Он ни-
чего не делает. TApplication используется для создания порожденных типов от TApplication. кото-
рые  содержат  программный  код.  Например,  в  простейшей  демонстрационной  программе  HEL-
LO.PAS, выводящей в стандартном для Turbo-Vision виде надпись HELLO, WORLD! определяется 
порожденный тип объекта THelloApp: 

 

PHelloApp = ^HelloApp; 
THelloApp = object(TApplication) 

procedure GreetingBox; 
procedure HadleEvent(var Event: TEvent); virtual; 
procedure InitMenuBar; virtual; 

procedure InitStatusLine; virtual; 

end; 
 

Как показано здесь, полезно определить тип указателя на каждый тип определяемого объ-

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

THelloApp  содержит  гораздо  больше,  чем  четыре  содержащихся  в  нем  метода;  порожден-

ный объект наследует все от его предка. В определении THelloApp определяется, чем новый объ-
ект отличается от его предка TApplication. Все, что не переопределяется, наследуется в неизмен-
ном виде от TApplication. 

Четыре метода, определенные в THelloApp, завершают приложения: 
1) метод

 HadleEvent

 определяет, что некоторые события произошли (и указывает это) и как 

на  эти  события  отвечать  другим  прикладным  функциям;  метод  HadleEvent,  определенный  в 
TApplication, работает с общими событиями, которые возникают внутри любой программы, но не-
обходимо обеспечить обработку событий, специфичных для программы; 

2) метод

 InitMenuBar

 устанавливает меню для

 

полосы Меню программы (TApplication со-

держит полосу меню, но не сами меню); 

3) метод 

InitStatusLine

 устанавливает текст строки статуса внизу экрана; этот текст обычно 

отображает сообщение о текущем состоянии программы, показывая доступные горячие клавиши 
или напоминая пользователю о некоторых действиях; 

4)  метод 

GreetingBox

  вызывает  диалоговое  окно  в  ответ  на  элемент  меню  Greeting; 

GreetingBox  вызывается  из  метода  HadleEvent  в  ответ  на  событие,  переключаемое  выбором  эле-
мента меню Greeting; в более сложных программах можно использовать различные методы в ответ 
на каждый элемент меню, определяемый в начальном меню. 

На  верхнем  уровне  абстракции  главная  программа  на  Turbo-Vision  выглядит  аналогично 

Hello и содержит три метода: 

 

var 

HelloWorld: THelloApp; 

begin 

HelloWorld.Init; 
HelloWorld Run; 

HelloWorld.Done; 

end; 

 

Каждый из этих трех методов требует небольшого пояснения. 

Init

  -  это  необходимый вызов  конструктора. Все объекты,  содержащие виртуальные мето-

ды, должны быть созданы (через вызов их конструктора) до вызова любых других методов этого