Объектный тип в Турбо-Паскале

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

type TImage = object {объект - изображение TImage} X, Y: integer; { координаты левого верхнего угла изображения} RX, RY: integer; {размеры изображения по осям X, Y} V: boolean; {признак видимости изображения} end;

Для объявления типа "объект" было использовано ключевое слово Object. Переменная типа TImage может объявляться статически (в секции Var) или динамически (с помощью соответствующего указателя и процедуры New). Обращение к полям объектного типа осуществляется с использованием составного имени или оператора With.
В соответствии с концепциями ООП объект содержит не только данные (в нашем примере X, Y, RX, RY, V), но и правила их преобразования, оформленные в виде процедур и функций, например:

type PImage=^TImage; {указатель на объект-изображение} TImage=object {объект-изображение - предок для символа и строки} X,Y: integer; {координаты левого верхнего угла изображения} RX, RY: integer; {размеры изображения по осям X,Y} V: boolean; {признак видимости изображения} procedure Init(A,B:integer); {инициализирует координаты X,Y} procedure On; {делает изображение видимым} procedure Off; {делает изображение невидимым} procedure Move(Dx,Dy:integer); {передвигает изображение на экране} function GetX:integer; {определяет координату X} function GetY:integer; {определяет координату Y} procedure PrintImage; {выводит изображение на экран} end;

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

Приведем тексты некоторых подпрограмм - методов:

procedure TImage.Init(A,B: integer); begin X:=A; Y:=B; V:=FALSE; end; procedure TImage.On; begin end; {пустая процедура} procedure TImage.Move(Dx,Dy: integer); begin Off; {погасить изображение} X:=X+Dx; Y:=Y+Dy; {переместить изображение} On; {включить изображение} end; function TImage.GetX:integer; begin GetX:=X; end; procedure TImage.PrintImage; begin end; {пустая процедура}

Теперь можно определить в программе экземпляры объекта, например:

Var TIm: TImage; PIm: PImage;

и в дальнейшем оперировать с экземплярами объектов, используя объявленные методы:

TIm.Init(1,1); New(PIm); PIm^.Init(1,1); PIm^.Mov(-1,0); {движение на одну позицию влево}

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