Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Прикладное программирование.doc
Скачиваний:
9
Добавлен:
25.12.2018
Размер:
683.01 Кб
Скачать

Var s: String;

Begin

S:=TCoIorLine.Cla»sParent.ClassNanie; // S содержит TLine S:=ALine.ClassName; // S содержит TLine

Наибольшие возможности заложены в функции Classlnfo, для обслужи­вания которой в Delphi предусмотрен целый блок Typlnfo, включающий большой набор методов, позволяющих манипулировать информацией о ти­пах объектов, типах свойств объектов, типах указателей на методы, при­сваивать значения свойствам объектов. Следует только иметь в виду, что подробная информация для RTTI генерируется для раздела Published потом­ков класса TPersistent. Примеры использования этой функции имеются в ис­точниках, приведенных в списке литературы.

б) Реализация классовых методов.

Реализация классового метода достаточно проста. Основное отличие за­ключается в том, что реализация должна начинаться с зарезервированного слова Class.

Синтаксис реализации классовых методов следующий:

Class Procedure <имя класса>.<имя процедуры>[(<параметры>)];

[<блок объявлений>]

Begin

<Исполняемые операторы>

End;

Class Function <имя класса>.<имя функции>[(<параметры>)]:

<тип результатам, [<блок обьявлений>]

Begin

<Исполняемые операторы>

Result:'=<возвращаемое значение>;

<Исполняемые операторы>

End;

Примечания:

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

Важно помнить, что внутри классового метода нет доступа к полям экземпляра класса.

в) Вызов классовых методов. Классовые методы могут быть вызваны несколькими способами:

• с использованием имени класса:

<имя класса>.<имя классового метода>[{<параметры>}];

• через экземпляр класса, т.е. как обычный метод, а именно:

<имя объекта>.<имя классового метода>[(<параметры>)];

• классовые методы могут также вызываться с помощью переменной' типа указателя на класс.

2.4. Скрытый Self

Между самостоятельными подпрограммами и методами, исключая клас­совые, имеется существенное отличие, которое состоит в способе доступа к данным экземпляра класса.

Как известно, для того, чтобы самостоятельные подпрограммы могли работать с элементами данных, эти данные должны быть переданы подпро­граммам, предпочтительно в виде параметров. Кроме того, самостоятельные подпрограммы имеют доступ к любым данным, объявленным глобально в модуле или программе, а также ко всем глобальным переменным других мо­дулей, перечисленных в списке секции Uses.

Методы, исключая классовые, имеют, помимо этого, неявный доступ к полям того экземпляра класса, который был использован при их вызове. Это происходит потому, что фактически при вызове в каждый метод передается дополнительный параметр - указатель на использовавшийся при вызове ме­тода объект, а внутри метода стоит неявный оператор With, заключающий в себе все тело метода. Этот неявный параметр (предопределенный идентификатор) называется Self, и он имеет тот же тип. что и класс, в котором опреде­лен метод.

Все тело метода заключено в неявный оператор With Self Do, который предоставляет методу доступ к полям, свойствам и другим методам данного объекта. Поскольку параметр Self неявно присутствует внутри метода, то в большинстве случаев не будет возникать необходимости в его явном исполь­зовании. Его явное использование может понадобиться, например, для раз­решения конфликтов идентификаторов внутри метода, когда имя локальной переменной совпадает с именем поля. Тогда для обращения к полю, напри­мер, FTitle следует указать Self.FTitle.

Параметр Self часто используется, когда требуется обратиться к текущей форме в одном из ее методов. Типичный пример - динамическое создание компонента, когда нужно передать параметр Owner (т.е. указать владельца) конструктору Create. Например, по щелчку мыши по форме (событие OnMouseDown) или даже по щелчку по другой кнопке (событие OnClick) можно создать кнопку.

With TButton.Create(Sell) Do Begin

Parent:=Self; // Указывать Fonnl не требуется

SetBounds(X,Y,W,H); // (X- Left, Y- Top. W- Width, H - Height)

Name:='NewButton'; // Caption также будет равно NewButton

Visible:=True;

. . . // Значения других свойств

End;

Поскольку классовые методы могут вызываться и при отсутствии экзем­пляров класса, то они не могут иметь доступ к полям класса, поэтому у них отсутствует встроенный Self, и нет возможности использовать его поля, по­этому для классовых методов Self - переменная типа ссылки на класс, чей классовый метод был вызван. Фактически Self для классовых методов указы­вает на VMT.