Объекты. Основные понятия.

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

 

С формальной точки зрения, объектные типы в языке Turbo Pascal очень похожи на хорошо знакомые комбинированные типы (записи). Иными словами, объектные типы также являются составными типами, элементы (поля) которых могут иметь любой тип. Так, простейший пример объектного типа выглядит следующим образом:

type

TPoint = object

X , Y : integer ;

Visible : boolean ;

end ;

Здесь для формирования структуры используется служебное слово object, а содержимым объектного типа являются два поля целого типа и одно - булевского типа. Назначением такой структуры может быть хранение информации о положении некоторой точки на экране дисплея и о видимости этой точки. В дальнейшем, введенный таким образом тип TPoint, можно использовать в программе обычным образом: определять переменные этого типа (как статически посредством описателя Var- так и динамически, создавая экземпляр переменной этого типа с помощью стандартной процедуры New), работать с полями и т.д.

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

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

type

TPoint = object

X , Y : integer ;

Visible : boolean ;

procedure Create ( a , b : integer ) ;

procedure SwitchOn ;

procedure SwitchOff ;

procedure Move ( dx , dy : integer ) ;

function GetX : integer ;

function GetY : integer ;

end ;

procedure TPoint.Create (a, b: integer);

begin

X := a ; Y := b ;

Visible := false

end ;

procedure TPoint.SwitchOn ;

begin

Visible := true ;

PutPixel ( X , Y , GetColor )

end ;

function TPoint.GetX : integer ;

begin

GetX := X

end ;

function TPoint.GetY : integer;

begin

GetY := Y

end;

procedure TPoint.Move (dx,dy : integer);

begin

SwitchOn ;

x := x+dx;

y := y+dy

SwitchOff

end;

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

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

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

var

OnePoint : TPoint ;

и в дальнейшем оперировать с этим экземпляром посредством его методов:

OnePoint.Create (100, 200);

OnePoint.SwitchOn ;

OnePoint.Move (20, -10 );

Для объектных типов так же, как и для записей, допускается использование оператора присоединения. Так, предыдущий фрагмент может быть переписан следующим образом:

with OnePoint do begin

Create (100, 200);

SwitchOn ;

Move (20, -10)

end;

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

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

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

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