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, пример будет компилироваться и работать, как ожидалось.

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