10.7 Использование |
Вверх Предыдущий Следующий |
После того, как хелпер класса определен, его методы могут быть использованы всякий раз, когда хелпер класса находится в области видимости. Это означает, что, если он определен в отдельном модуле, то этот модуль должен находиться в пункте uses везде, где используются методы хелпера класса. Рассмотрим следующий модуль: {$mode objfpc} {$h+} unit oha;
interface
Type TObjectHelper = class helper for TObject function AsString(const aFormat: String): String; end;
implementation
uses sysutils;
function TObjectHelper.AsString(const aFormat: String): String; begin Result := Format(aFormat, [ToString]); end;
end. Тогда будет скомпилирован следующий код: Program Example113;
uses oha;
{ Программа для демонстрации области видимости хелпера. }
Var o : TObject;
begin O:=TObject.Create; Writeln(O.AsString('Объект "O" в виде строки : %s')); end. Но, если создан второй модуль (ohb): {$mode objfpc} {$h+} unit ohb;
interface
Type TAObjectHelper = class helper for TObject function MemoryLocation: String; end;
implementation
uses sysutils;
function TAObjectHelper.MemoryLocation: String; begin Result := format('%p',[pointer(Self)]); end;
end. И он добавлен после первого модуля в пункте uses: Program Example113;
uses oha,ohb;
{ Программа для демонстрации области видимости хелпера. }
Var o : TObject;
begin O:=TObject.Create; Writeln(O.AsString('Объект "O" в виде строки : %s')); Writeln(O.MemoryLocation); end. Тогда компилятор будет жаловаться, что он не знает метод 'AsString'. Это происходит потому, что компилятор перестает искать хелпер класса, как только встречает первый хелпер класса. Так как модуль ohb расположен последним в пункте uses, компилятор будет использовать только TAObjectHelper как хелпер класса. Решение состоит в том, чтобы повторно реализовать модуль ohb: {$mode objfpc} {$h+} unit ohc;
interface
uses oha;
Type TAObjectHelper = class helper(TObjectHelper) for TObject function MemoryLocation: String; end;
implementation
uses sysutils;
function TAObjectHelper.MemoryLocation: String; begin Result := format('%p',[pointer(Self)]); end;
end. А после замены модуля ohb на ohc, пример будет компилироваться и работать, как ожидалось. Обратите внимание, что включить модуль с хелпером класса один раз в проекте недостаточно. Модуль должен быть включен всякий раз, когда хелпер класса необходим. |