Класс Дорога
Объектно-ориентированная программа начинается с описания классов объектов. Класс в программе — это новый тип данных. Как и структура (см. § 39), класс — это сложный тип данных, который может объединять переменные различного типа в единый блок. Однако, в отличие от структуры, класс содержит не только данные, но и методы работы с ними (процедуры и функции).
В нашей программе самый простой класс — это Дорога. Объекты этого класса имеют два свойства: длину (англ. length), которая может быть вещественным числом, и ширину (англ. width) — количество полос, целое число. Для хранения значений свойств используются переменные, принадлежащие объекту, которые называются полями.
Поле — это переменная, принадлежащая объекту.
Значения полей описывают состояние объекта, а методы — его поведение.
Описание класса Дорога в программе на объектной версии Паскаля (здесь имеется в виду FreePascal или Delphi) выглядит так:
type TRoad = class Length: real; Width: integer; end;
Эти строки вводят новый тип данных — класс TRoad 1, т. е. сообщают компилятору, что в программе, возможно, будут использоваться объекты этого типа. При этом в памяти не создаётся ни одного объекта. Это описание похоже на чертёж, по которому в нужный момент можно построить сколько угодно таких объектов.
1 Буква «Т» в начале названия класса — это сокращение от слова type.
Если мы хотим работать с объектом класса TRoad, в программе нужно объявить соответствующую переменную:
var road: TRoad;
Однако и это ещё не объект, а ссылка (указатель), т. е. переменная, в которой можно сохранить адрес любого объекта класса TRoad. Чтобы создать сам объект в памяти, нужно вызвать специальный метод Create, который называется конструктором. Адрес нового объекта записываем в переменную road:
road:=TRoad.Create;
Созданный объект относится к классу TRoad, поэтому его называют экземпляром класса TRoad.
При описании класса мы ничего не говорили о методе Create. Он добавляется ко всем классам по умолчанию, при его вызове все переменные объекта заполняются нулями 2.
2 Хотя стандарта на этот счёт нет, так сделано во всех объектных реализациях Паскаля.
Конструктор — это метод класса, который вызывается для создания объекта этого класса.
Свойства дороги можно изменить с помощью точечной нотации, с которой вы познакомились, работая со структурами:
road.Length:=60; road.Width:=3;
Полная программа, которая создаёт объект «дорога» (и больше ничего не делает), выглядит так:
{$mode objfрс} type TRoad = class Length: real; Width: integer; end; var road: TRoad; begin road:=TRoad.Create; road.Length:=60; road.Width:=3 end.
Строка {$mode objfpc} по форме похожа на комментарий, потому что заключена в фигурные скобки. Однако для компилятора это команда перейти в режим работы с объектами (англ. mode — режим; object — объект; FPC — Free Pascal Compiler — свободно распространяемый компилятор Паскаля).
Начальные значения полей можно задавать прямо при создании объекта. Для этого нужно добавить в описание класса новый конструктор. Конструктору будет передаваться два параметра — начальные значения длины и ширины дороги:
type TRoad = class Length: real; Width: integer; constructor Create(lengthO: real; width0: integer) end;
Реализация (программа) конструктора может выглядеть так:
constructor TRoad.Create(length0: real; width0: integer); begin if length0>0 then Length:=length0 else Length:=1; if width0>0 then Width:=width0 else Width:=1; end;
Здесь проверяется правильность переданных параметров, чтобы по ошибке длина и ширина дороги не оказались нулевыми или отрицательными 3. Теперь создавать объект будет проще:
road:=TRoad.Create (60, 3) ;
Длина этой дороги — 60 единиц, она содержит 3 полосы.
Таким образом, класс выполняет роль «фабрики», которая «выпускает» (создаёт) объекты «по чертежу» (описанию класса) при вызове конструктора.
3 Конечно, в реальной программе при передаче неправильных данных нужно выдавать сообщение об ошибке.
Следующая страница Класс Машина