Объектно-Приентированное Программирование в Delphi (ООП): основы

Класс

 

Классический язык Pascal позволяет программисту определять свои собственные сложные типы данных — записи (records). Язык Delphi, поддерживая концепцию объектно-ориентированного программирования, дает возможность определять классы. Класс — это сложная структура, включающая, помимо описания данных, описание процедур и функций, которые могут быть выполнены над представителем класса — объектом. 

Вот пример объявления простого класса:


 

Данные класса называются полями, процедуры и функции — методами. 

В приведенном примере

  • TPerson — это имя класса,
  • fname и faddress -имена полей,
  • show — имя метода.

 

Примечание: Согласно принятому в Delphi соглашению, имена полей должны начинаться с буквы f (от слова field — поле).

Описание класса помещают в программе в раздел описания типов (type)

Объект 

Объекты как представители класса объявляются в программе в разделе var,
например:

Объекты как представители класса объявляются в программе в разделе var, например: 

 

Примечание: В Delphi объект— это динамическая структура. Переменная-объект содержит не данные, а ссылку на данные объекта. Поэтому программист должен позаботиться о выделении памяти для этих данных.

 

Выделение памяти осуществляется при помощи специального метода класса — конструктора, которому обычно присваивают имя Create (создать). Для того чтобы подчеркнуть особую роль и поведение конструктора, в описании класса вместо слова procedure используется слово constructor.

Ниже приведено описание класса TPerson, в состав которого введен конструктор:

 

 

Выделение памяти для данных объекта происходит путем присваивания значения результата применения метода-конструктора к типу (классу) объекта.

Например, после выполнения инструкции 

выделяется необходимая память для данных объекта professor. 

 

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

 

Ниже приведен пример реализации конструктора для объекта TPerson:

 

Реализация конструктора несколько необычна. Во-первых, в теле конструктора нет привычных инструкций New, обеспечивающих выделение динамической памяти (всю необходимую работу по выделению памяти выполняет компилятор). Во-вторых, формально конструктор не возвращает значения, хотя в программе обращение к конструктору осуществляется как к методу функции.

 

После объявления и инициализации объект можно использовать, например, установить значение поля объекта. Доступ к полю объекта осуществляется указанием имени объекта и имени поля, которые отделяются друг от друга точкой. Хотя объект является ссылкой, правило доступа к данным с помощью ссылки, согласно которому после имени переменной, являющейся ссылкой, надо ставить значок Л, на объекты не распространяется. 

Например, для доступа к полю fname объекта professor вместо 

professor^. fname
 

надо писать  

professor. fname
 

Очевидно, что такой способ доступа к полям объекта более естественен.

Если в программе какой-либо объект больше не используется, то можно освободить память, занимаемую полями данного объекта. Для выполнения этого действия используют метод-деструктор Free, Например, для того, чтобы освободить память, занимаемую полями объекта professor, достаточно записать professor.Free;

 Метод 

Методы класса (процедуры и функции, объявление которых включено в описание класса) выполняют действия над объектами класса. Для того что-бы метод был выполнен, необходимо указать имя объекта и имя метода, отделив одно имя от другого точкой. Например, инструкция  Методы класса (процедуры и функции, объявление которых включено вописание класса) выполняют действия над объектами класса. Для того чтобы метод был выполнен, необходимо указать имя объекта и имя метода,отделив одно имя от другого точкой.

Например, инструкция professor.Show; 

вызывает применение метода Show к объекту professor. Фактически инструкция применения метода к объекту — это специфический способ записи инструкции вызова процедуры.

 

Методы класса определяются в программе точно так же, как и обычные процедуры и функции, за исключением того, что имя процедуры или функции, являющейся методом, состоит из двух частей: имени класса, к которому принадлежит метод, и имени метода. Имя класса от имени метода отделяется точкой.

 

Ниже приведен пример определения метода show класса TPerson:

 

Примечание: В инструкциях метода доступ к полям объекта осуществляется без указания имени объекта. 


Инкапсуляция и свойства объекта

 

Под инкапсуляцией понимается скрытие полей объекта с целью обеспечения доступа к ним только посредством методов класса.
В языкеDelphiограничение доступа к полям объекта реализуется при помощи свойств объекта. Свойство объекта характеризуется полем, сохра-
няющим значение свойства, и двумя методами, обеспечивающими доступ к полю свойства. Метод установки значения свойства называется методом
записи свойства (write), а метод получения значения свойства — методом чтения свойства (read)

 

В описании класса перед именем свойства записывают слово property (свойство). После имени свойства указывается его тип, затем — имена методов, обеспечивающих доступ к значению свойства. После слова read указывается имя метода, обеспечивающего чтение свойства, после слова write — имя метода, отвечающего за запись свойства. 

 

Ниже приведен пример описания класса TPerson, содержащего два свойства: Name И Address.

 

В программе для установки значения свойства не нужно записывать инструкцию применения к объекту метода установки значения свойства, а надо записать обычную инструкцию присваивания значения свойству. Например, чтобы присвоить значение свойству Address объекта student, достаточно записать 

student.Address:='С.Петербург,ул.Садовая 21, кв.3';

 

Компилятор перетранслирует приведенную инструкцию присваивания значения свойству в инструкцию вызова метода

student.SetAddress('С.Петербург, ул.Садовая 21, кв.ЗМ;

 

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

 

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

 

Оформление данных объекта как свойства позволяет ограничить доступ к полям, хранящим значения свойств объекта: например, можно разрешить только чтение. Для того чтобы инструкции программы не могли изменить значение свойства, в описании свойства надо указать лишь имя метода чтения. Попытка присвоить значение свойству, предназначенному только для чтения, вызывает ошибку времени компиляции. В приведенном выше описании класса ТРеrson свойство кате доступно только для чтения, а свойство Address — для чтения и записи.

 

Установить значение свойства, защищенного от записи, можно во время инициализации объекта. Ниже приведены методы класса ТРегзоп, обеспечивающие создание объекта класса ТРеrson и доступ к его свойствам.

Приведенный конструктор объекта TPerson создает объект и устанавливает значение поля FName, определяющего значение свойства Name. 

Инструкции программы, обеспечиваюшие создание объекта класса TPerson и установку его свойства, могут быть, например, такими:


dle

Помоги проекту! Расскажи друзьям об этом сайте: