На этом шаге мы рассмотрим вопросы, связанные с созданием объектов.
Описание объекта (Object)
Директивы Private, Public
Конструкторы и деструкторы
В языке программирования Turbo Pascal для создания объектов используются три зарезервированных слова: Object, Constructor, Destructor и три стандартные директивы: Private, Public и Virtual.
Зарезервированное слово Object используется для описания объекта. Описание объекта должно помещаться в разделе описания типов:
Type
<Имя объекта> = Object
{ Поля объекта }
{ Методы объекта }
End;
Если объект порождается от какого-либо родителя, имя родителя указывается в круглых
скобках сразу за словом Object:
Type
<Имя объекта> = Object (<Имя объекта-родителя> )
. . . . .
End;
Любой объект может иметь сколько угодно потомков, но только одного родителя, что позволяет создавать иерархические деревья наследования объектов.
Для нашей учебной задачи создадим объект-родитель TGraphObject, в рамках которого будут инкапсулированы поля и методы, общие для всех остальных объектов:
Type TGraphObj = Object Private { Поля объекта будут скрыты от пользователя } X,Y: Integer; { Координаты реперной точки } Color: Word; {Цвет фигуры } Public {Методы объекта будут доступны пользователю } { Создает экземпляр объекта } Constructor Init (aX, aY: Integer; aColor: Word); { Вычерчивает объект заданным цветом aColor } Procedure Draw (aColor: Word ); Virtual; { Показывает объект - вычерчивает его цветом aColor } Procedure Show; Procedure Hide; {Прячет объект - вычерчивает его цветом фона} { Перемещает объект в точку с координатами X+dX и Y+dY} Procedure MoveTo ( dX, dY: Integer); End; { Конец описания объекта TgraphObj }
В дальнейшем предполагается создать объекты - потомки от TGraphObj, реализующие все специфические свойства точки, линии, окружности и прямоугольника. Каждый из этих графических объектов будет характеризоваться положением на экране (поля X и Y) и цветом (поле Color). С помощью метода Draw он будет способен отображать себя на экране, а с помощью свойств "показать себя" (метод Show) и "спрятать себя" (метод Hide) сможет перемещаться по экрану (метод MoveTo). Учитывая общность свойств графических объектов, мы объявляем абстрактный объект TGraphObj, который не связан с конкретной графической фигурой. Он объединяет в себе все общие поля и методы реальных фигур и будет служить родителем для других объектов.
Директива Private в описании объекта открывает секцию описания скрытых полей и методов. Перечисленные в этой секции элементы объекта "не видны" программисту, если этот объект он получил в рамках библиотечного tpu-модуля. Скрываются обычно те поля и методы, к которым программист не должен иметь непосредственного доступа. В нашем примере он не может произвольно менять координаты реперной точки (X,Y), так как это не приведет к перемещению объекта. Для изменения полей X и Y предусмотрены входящие в состав объекта методы Init и MoveTo. Скрытые поля и методы доступны в рамках той программной единицы (программы или модуля), где описан соответствующий объект. В дальнейшем предполагается, что программа будет использовать модуль GraphObj с описанием объектов. Скрытые поля будут доступны в модуле GraphObj, но недоступны в использующей его основной программе.
Директива Public отменяет действие директивы Private, поэтому все следующие за Public элементы объекта доступны в любой программной единице. Директивы Private и Public могут произвольным образом чередоваться в пределах одного объекта.
Описания полей ничем не отличаются от описания обычных переменных. Полями могут быть любые структуры данных, в том числе и другие объекты. Используемые в нашем примере поля X и Y содержат координату реперной точки графического объекта, а поле Color - его цвет. Реперная точка характеризует текущее положение графической фигуры на экране.
Для описания методов в ООП используются традиционные для Pascal процедуры и функции, а также особый вид процедур - конструкторы и деструкторы. Конструкторы предназначены для создания конкретного экземпляра объекта, ведь объект - это тип данных, то есть "шаблон", по которому можно создать сколько угодно рабочих экземпляров данных объектного типа (например, типа TGraphObj). Зарезервированное слово Constructor, используемое в заголовке конструктора вместо Procedure, предписывает компилятору создать особый код пролога, с помощью которого настраивается так называемая таблица виртуальных методов. Если в объекте нет виртуальных методов, в нем может не быть ни одного конструктора, наоборот, если хотя бы один метод описан как виртуальный (с последующим словом Virtual, см. метод Draw), в состав объекта должен входить хотя бы один конструктор и обращение к конструктору должно предшествовать обращению к любому виртуальному методу.
Типичное действие, реализуемое конструктором, состоит в наполнении объектных полей
конкретными значениями. Разные экземпляры одного и того же объекта отличаются друг
от друга только содержимым объектных полей, в то время как каждый из них использует
одни и те же объектные методы. В нашем примере конструктор Init объекта TGraphObj
получает все необходимые для полного определения экземпляра данные через параметры
обращения aX, aY и aColor.
Следующий шаг содержит продолжение описания объектов, в частности мы поговорим
о таблице виртуальных методов (ТВМ).
Описание объекта (Object)
Директивы Private, Public
Конструкторы и деструкторы