13.1. Определения объектов

We use cookies. Read the Privacy and Cookie Policy

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

- 271 -

методами. Для обозначения типа «объект» в языке имеется служебное слово OBJECT. Тип объекта описывается способом, похожим на задание типа «запись»:

TYPE

ИмяОбъекта = OBJECT

ПоляДанных;

ЗаголовкиМетодов;

END;

Конкретную переменную, объявленную типом ИмяОбъекта, принято называть экземпляром этого типа.

Рассмотрим в качестве примера основные типы объектов для работы с символьной и текстовой информацией. При построении объектов всегда следует начинать с определения самого нижнего (элементарного) уровня данных и действий. Так, при работе с текстовой информацией на дисплее за нижний уровень представления данных можно принять позицию курсора (назовем ее ObjPos), определяемую двумя параметрами: номером строки (Line) и номером позиции в ней, т.е. столбцом (Col). Для задания позиции и символа объявляем процедуру Init, которая должна присваивать значения полям Line и Col, а для определения позиции вводим две функции: GetLine и GetCol (рис. 13.1). Метод Print не выполняет здесь никаких действий, но понадобится в дальнейших примерах.

TYPE

ObjPos = OBJECT

Line : Word; { номер строки }

Col : Word; { номер столбца }

PROCEDURE Init(init_line, init_col : Word);

FUNCTION GetLine : Word; { опрос Line }

FUNCTION GetCol : Word; { опрос Col }

PROCEDURE Print { зарезервировано }

END;

PROCEDURE ObjPos.Init( init_line, init_col : Word );

BEGIN

Line := init_line; { метод задания номера строки }

Col := init_col; { метод задания номера столбца }

END;

Рис. 13.1

- 272 -

FUNCTION ObjPos.GetLine : Word;

BEGIN

GetLine := Line { метод опроса номера строки }

END;

FUNCTION ObjPos.GetCol : Word;

BEGIN GetCol := Col { метод опроса номера столбца }

END;

PROCEDURE ObjPos.Print;

{ пустая процедура вывода }

BEGIN

Write( #7 ); { это вызовет звуковой сигнал }

END;

VAR ObjPosVar : ObjPos;

{ объявление экземпляра объекта }

(*Прочие описания типов, переменных, процедур, функций*)

BEGIN

{ Пример вызова метода назначения позиции: }

ObjPosVar.Init( 5, 15 );

...

END.

Рис. 13.1 (окончание)

В описании объекта фиксируется только название метода, в то время как его реализация в виде процедуры или функции может находиться в каком-либо из блоков описания процедур и функций. При реализации метода перед его именем обязательно указывается имя типа объекта, которому принадлежит метод. Разделителем имен служит точка «.». Обращаем внимание на то, что после объявления конкретного экземпляра объекта (на рис. 13.1 это переменная ObjPosVar) вызов метода предваряется уже не именем типа, а именем конкретного экземпляра.

Задание заголовка метода в описании типа объекта можно считать опережающим описанием (FORWARD), и поэтому при реализации метода можно не включать в его заголовок список формальных параметров.

Объектный подход подразумевает, что объявляемый в программе объект содержит исчерпывающие данные о соответствующем «физическом» объекте, поэтому методы, объявляемые в объекте, должны по возможности обращаться только к друг другу и к полям

- 273 -

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

ObjPosVar.Line := 5;

ObjPosVar.Col := 15;

Но в таком случае мы, во-первых, как бы «выносим» метод за границы объекта, а во-вторых, метод назначения позиции может быть гораздо более сложным (и мы это покажем позже), и в случае его изменения придется переделывать все присваивания вместо одного единственного метода. В ООП должно выполняться «джентльменское» соглашение: доступ к полям-данным объекта должны иметь только методы этого объекта. Нарушение этого правила может свести на нет все преимущества объектного подхода.

При объявлении объектов должны выполняться следующие требования:

— описание типа «объект» может производиться только в блоке определения типов TYPE основной программы или в разделах модулей; нельзя описывать локальные объекты в подпрограммах;

— при описании типа объекта все поля данных должны находиться перед описаниями методов;

– компоненты объекта не могут быть файлами, а файлы, в свою очередь, не могут содержать компоненты типа «объект».

Данные типа «объект» не могут быть записаны в файл на диске. Тем не менее в демонстрационном архиве OOP.ARC пакета Турбо Паскаль приведены две программы: OBJECTS.PAS и ODEMO.PAS, которые совместно с находящимися там же ассемблерными вставками реализуют механизм хранения объектов на диске.