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

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

Всего существует шесть разновидностей методов объектов:
методы-процедуры, которые аналогичны самостоятельным процедурам, за исключением того, что они «присоединены» к тому классу, в котором заданы, и могут быть вызваны лишь через какой-либо активный экземпляр этого класса;

методы-функции, которые возвращают значения и ведут себя так же, как и обычные самостоятельные функции, с той лишь разницей, которая указана для методов-процедур;

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

классовые функции, которые аналогичны классовым процедурам, но возвращают результат;

конструкторы — это специальные методы, ведущие себя аналогично классовым функциям. Они также вызываются с помощью ссылки на класс, в котором они заданы, и возвращают значение, которое является ссылкой на вновь созданного представителя этого класса. Таким образом и создаются экземпляры классов — путем вызова конструктора соответствующего класса;

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

Особенности объявления:
Все методы описываются в программе дважды:
— первоначально в объявлении класса располагается (в интерфейсе модуля) объявление метода, которое служит для того, чтобы сообщить компилятору о намерении создать метод. Это подобно объявлению Forward для обычных процедур и функций;
— тело метода размещается вне объявления класса — в разделе реализации (Implementation) того же модуля, либо в программе или в библиотеке, до основного блока Begin End.

• Внутри одного класса можно объявить столько методов, сколько требуется.

• При объявлении методы разных видов могут быть перемешаны между собой.

• Объявления методов могут быть сгруппированы в разделы, важно лишь, чтобы в пределах каждого раздела в описании класса все поля объявлялись до объявления методов.

• За именем метода может следовать заключенный в скобки необязательный список параметров, синтаксис написания которого аналогичен обычным подпрограммам.

Слова-дерективы

По умолчанию все методы являются статическими. При объявлении метода может быть использовано несколько команд (слов-директив), конкретизирующих вариант вызова метода: Class, Virtual, Dynamic, Abstract, Override, Overload, Reintroduce, Message.

Class — классовый метод.

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

Virtual – классовая переменная имеет указатель на VMT. Компилятор ищет метод по смещению, начиная со всех родительских. Для полиморфизма.

Dynamic — то же самое, что и Virtual, но таблица содержит только новые динамические или перегруженные методы.

Abstract — обычно Virtual; Abstract; нет реализации. Она будет только в потомках.

Override — когда переопределяются Virtual или Dynamic.

Overload— когда 2 функции в одной зоне видимости имеют одно имя (должны отличаться списком параметров)

Reintroduce – если в родительском test(i:integer); Overload; Virtual; а в дочернем test(i:string); Reintroduce; Virtual, чтобы не перекрывалось при разных параметрах.

Message – для сообщений Windows
Возможно предварительное объявление класса, но без использования директивы Forward’.

Type <имя класса>=Сlass[(<имя родительского класса>)};

Внутри методов можно обращаться к методам предков, используя конструкцию:

[Self.]<имя метода>[(<параметры>)];

Можно получить указатель на класс-предок с помощью классового метода TObject: ClassParent:

S:=TCoIorLine.ClassParent


Оставить комментарий





Статистика

Рейтинг@Mail.ru