Классовые процедуры и функции — синтаксис объявления и вызов


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

Синтаксис объявления классовых методов:

Type <имя клacca>=Class[(<имя родительского класса>)]
Class Procedure <имя процедуры>[(<параметры>)};
Class Function <имя функции>[(<параметры>)]:<тип результата>
End;

Примечания:
• Каждое объявление классового метода должно начинаться с зарезервированного слова Class, за которым следует объявление процедуры или функций по обычным правилам.
• Фактически классовые методы ничем не отличаются от обычных процедур и функций. Классовые методы — это лишь удобная возможность указать, что данный метод логически относится к данному классу.
• Реализация классового метода не должна зависеть от состояния любого поля класса во время выполнения. Поля экземпляра класса недоступны для этих методов.
• Классовые методы могут быть виртуальными, при этом их можно переопределять и использовать полиморфизм.

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

реализация должна начинаться с зарезервированного слова Class:

Class Function <имя класса>.<имя функции>[(<параметры>)]:
<тип результатам, [<блок обьявлений>]
Begin
<Исполняемые операторы>
Result:=<возвращаемое значение>;
<Исполняемые операторы>
End;

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

Вызов классовых методов

Классовые методы могут быть вызваны несколькими способами:
• с использованием имени класса:
<имя класса>.<имя классового метода>[{<параметры>}];
• через экземпляр класса, т.е. как обычный метод, а именно:
<имя объекта>.<имя классового метода>[(<параметры>)];
• классовые методы могут также вызываться с помощью переменной’ типа указателя на класс.

Скрытый Self

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

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

Параметр Self часто используется, когда требуется обратиться к текущей форме в одном из ее методов, например при динамическом создании компонента, Parent:=Self;

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

• Одно из назначений классовых методов заключается в возможности извлечения данных о классе из структуры RTTI. Важнейшие из них определены в самом классе TObject: имя класса (ClassName), размер экземпляра (InstanceSize), адреса (MethodAddress) и имена мето-дов (MethodName), указатель на класс-предок (ClassParent) и указатель (Classlnfo) на струк-туру PTypelnfo, позволяющую извлекать всю информацию о классе из структуры (RTTI) и другие.

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

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

Следует только иметь в виду, что подробная информация для RTTI генерируется для раздела Published потомков класса TPersistent


Комментарии запрещены.




Статистика