Класс
Классический язык Pascal позволяет программисту определять свои собственные сложные типы данных — записи (records). Язык Delphi, поддерживая концепцию объектно-ориентированного программирования, дает возможность определять классы. Класс — это сложная структура, включающая, помимо описания данных, описание процедур и функций, которые могут быть выполнены над представителем класса — объектом.
Вот пример объявления простого класса:
Данные класса называются полями, процедуры и функции — методами.
В приведенном примере
- TPerson — это имя класса,
- fname и faddress -имена полей,
- show — имя метода.
Примечание: Согласно принятому в Delphi соглашению, имена полей должны начинаться с буквы f (от слова field — поле).
Описание класса помещают в программе в раздел описания типов (type)
Объект
Объекты как представители класса объявляются в программе в разделе var, например:
Выделение памяти осуществляется при помощи специального метода класса — конструктора, которому обычно присваивают имя Create (создать). Для того чтобы подчеркнуть особую роль и поведение конструктора, в описании класса вместо слова procedure используется слово constructor.
Ниже приведено описание класса TPerson, в состав которого введен конструктор:
Выделение памяти для данных объекта происходит путем присваивания значения результата применения метода-конструктора к типу (классу) объекта.
Например, после выполнения инструкции
выделяется необходимая память для данных объекта professor.
Помимо выделения памяти, конструктор, как правило, решает задачу присваивания полям объекта начальных значений, т. е. осуществляет инициализацию объекта.
Ниже приведен пример реализации конструктора для объекта TPerson:
Реализация конструктора несколько необычна. Во-первых, в теле конструктора нет привычных инструкций New, обеспечивающих выделение динамической памяти (всю необходимую работу по выделению памяти выполняет компилятор). Во-вторых, формально конструктор не возвращает значения, хотя в программе обращение к конструктору осуществляется как к методу функции.
После объявления и инициализации объект можно использовать, например, установить значение поля объекта. Доступ к полю объекта осуществляется указанием имени объекта и имени поля, которые отделяются друг от друга точкой. Хотя объект является ссылкой, правило доступа к данным с помощью ссылки, согласно которому после имени переменной, являющейся ссылкой, надо ставить значок Л, на объекты не распространяется.
Например, для доступа к полю fname объекта professor вместо
professor^. fname
надо писать
professor. fname
Очевидно, что такой способ доступа к полям объекта более естественен.
Если в программе какой-либо объект больше не используется, то можно освободить память, занимаемую полями данного объекта. Для выполнения этого действия используют метод-деструктор Free, Например, для того, чтобы освободить память, занимаемую полями объекта professor, достаточно записать professor
.
Free;
Метод
Например, инструкция professor
.
Show;
вызывает применение метода Show к объекту professor. Фактически инструкция применения метода к объекту — это специфический способ записи инструкции вызова процедуры.
Методы класса определяются в программе точно так же, как и обычные процедуры и функции, за исключением того, что имя процедуры или функции, являющейся методом, состоит из двух частей: имени класса, к которому принадлежит метод, и имени метода. Имя класса от имени метода отделяется точкой.
Ниже приведен пример определения метода show класса TPerson:
Инкапсуляция и свойства объекта
В описании класса перед именем свойства записывают слово property (свойство). После имени свойства указывается его тип, затем — имена методов, обеспечивающих доступ к значению свойства. После слова read указывается имя метода, обеспечивающего чтение свойства, после слова write — имя метода, отвечающего за запись свойства.
Ниже приведен пример описания класса TPerson, содержащего два свойства: Name И Address.
В программе для установки значения свойства не нужно записывать инструкцию применения к объекту метода установки значения свойства, а надо записать обычную инструкцию присваивания значения свойству. Например, чтобы присвоить значение свойству Address объекта student, достаточно записать
student
.
Address:=
'С.Петербург,ул.Садовая 21, кв.3'
;
Компилятор перетранслирует приведенную инструкцию присваивания значения свойству в инструкцию вызова метода
student
.
SetAddress('С.Петербург, ул.Садовая
21
, кв.ЗМ;
Внешне применение свойств е программе ничем не отличается от использования полей объекта. Однако между свойством и полем объекта существует принципиальное отличие: при присвоении и чтении значения свойства автоматически вызывается процедура, которая выполняет некоторую работу.
В программе на методы свойства можно возложить некоторые дополнительные задачи. Например, с помощью метода можно проверить корректность присваиваемых свойству значений, установить значения других полей, логически связанных со свойством, вызвать вспомогательную процедуру.
Оформление данных объекта как свойства позволяет ограничить доступ к полям, хранящим значения свойств объекта: например, можно разрешить только чтение. Для того чтобы инструкции программы не могли изменить значение свойства, в описании свойства надо указать лишь имя метода чтения. Попытка присвоить значение свойству, предназначенному только для чтения, вызывает ошибку времени компиляции. В приведенном выше описании класса ТРеrson свойство кате доступно только для чтения, а свойство Address — для чтения и записи.
Установить значение свойства, защищенного от записи, можно во время инициализации объекта. Ниже приведены методы класса ТРегзоп, обеспечивающие создание объекта класса ТРеrson и доступ к его свойствам.
Инструкции программы, обеспечиваюшие создание объекта класса TPerson и установку его свойства, могут быть, например, такими: