10.1 Определение

На верх  Назад  Вперёд

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

Для записи или простого типа, хелпер действует так, как будто запись или простой тип является классом, методы объявляются аналогично. Внутри методов, Self будет ссылаться на значение записи или простого типа.

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

Синтаксическая схема для хелпера класса, записи или типа представлена ниже:


Тип хелпера

1001


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

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

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

Как и в экземпляре класса, идентификатор Self в методе хелпера для класса относится к экземпляру класса (а не к экземпляру хелпера). Для записи Self относится к записи.

Ниже приведен простой хелпер класса для класса TObject, который обеспечивает альтернативный вариант стандартного метода ToString.

TObjectHelper = class helper for TObject

  function AsString(const aFormat: String): String;

end;

 

function TObjectHelper.AsString(const aFormat: String): String;

begin

  Result := Format(aFormat, [ToString]);

end;

 

var

  o: TObject;

begin

  Writeln(o.AsString('Название объекта: %s'));

end.

Замечание:

'helper' является только модификатором для ключевых слов 'class' или 'record'. Это означает, что первый член класса или записи не может быть назван как 'helper'. Член класса или записи можно назвать helper (хелпером), но он не может быть первым, если его не экранировать символом '&', токже как и для всех идентификаторов, которые соответствуют ключевым словам.