Виды и назначение методов класса, Слова-директивы, используемые при объявлении методов и их назначение
Метод — это подпрограмма, которая определена как часть класса и включена в описание этого класса. Набор всех методов определяет операции, которые могут быть выполнены над экземпляром класса. Методы снабжают экземпляры класса поведением.
Всего существует шесть разновидностей методов объектов:
• методы-процедуры, которые аналогичны самостоятельным процедурам, за исключением того, что они «присоединены» к тому классу, в котором заданы, и могут быть вызваны лишь через какой-либо активный экземпляр этого класса;
• методы-функции, которые возвращают значения и ведут себя так же, как и обычные самостоятельные функции, с той лишь разницей, которая указана для методов-процедур;
• классовые процедуры, которые концептуально даже ближе к обычным самостоятельным процедурам, чем методы-процедуры. Для вызова классовых процедур не требуется экземпляр класса. Эти процедуры объявляются как часть класса и могут вызываться с использованием ссылки на сам класс (т.е. тип), а не на его экземпляр;
• классовые функции, которые аналогичны классовым процедурам, но возвращают результат;
• конструкторы — это специальные методы, ведущие себя аналогично классовым функциям. Они также вызываются с помощью ссылки на класс, в котором они заданы, и возвращают значение, которое является ссылкой на вновь созданного представителя этого класса. Таким образом и создаются экземпляры классов — путем вызова конструктора соответствующего класса;
• деструкторы — это также специальные методы объекта, похожие на методы-процедуры. Они точно также вызываются, как и они, т.е. необходимо использовать экземпляр класса. Предназначены деструкторы для уничтожения экземпляров класса.
Особенности объявления:
• Все методы описываются в программе дважды:
— первоначально в объявлении класса располагается (в интерфейсе модуля) объявление метода, которое служит для того, чтобы сообщить компилятору о намерении создать метод. Это подобно объявлению 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