Шаг 75.
Решение задачи. Создание объектов (начало)

    На этом шаге мы рассмотрим вопросы, связанные с созданием объектов.

Описание объекта (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 Конструкторы и деструкторы

Предыдущий шаг Содержание Следующий шаг