Создание собственного помощника (helper) для типов или классов в Delphi.

Здравствуйте уважаемые коллеги!

В данной статье я расскажу немного о помощниках в Delphi и покажу как можно написать своего помощника для типа Integer.

Помощники появились в Delphi XE3 и представляют собой тип, который позволяет расширять существующие классы или типы (или их потомков). Позволяют добавлять новые методы и свойства для классов, без использования наследования, и записей, которые не поддерживают наследования вовсе.

Объявление помощника для класса или типа выглядит следующим образом:

type
  Имя_помощника = class|record helper for Имя_класса_или_типа
    private
    public // Правила видимости идентичный классам или записям
      // Список свойств и методов
  end;

ВНИМАНИЕ!: помощники не поддерживают перегрузку операторов!.

Вы можете определить несколько помощников для одного типа, но только один из них (ближайший) будет использоваться.

Пример написания помощника для класса:

type
  TExample = class
    procedure ExampleProc;
    function ExampleFunc: integer;
  end;
***
procedure TExample.ExampleProc;  
begin
  ShowMessage(Self.ClassName);
end;

function TExample.ExampleFunc: Integer;
begin
  Result := -1;
end;
***

type
  TExampleClassHelper = class helper for TExample
    procedure ShowClassName;
    function ExampleFunc: Integer;
  end;
*** 
procedure TExampleClassHelper.ShowClassName;
begin
  ShowMessage('Имя класса: '+Self.CalssName); 
  // Ключевое имя Self в данном случае будет указывать на класс TExample
end;
 
function TExampleClassHelper.ExampleFunc: Integer;
begin
  Result := 1;
end;
***

var
  Ex: TExample;
begin
  Ex := TExample.Create;
  Ex.ExampleProc;    // Вызовет метод ExampleProc класса TExample. 
  // Выведет сообщение: "TExample".
  Ex.ShowClassName; // Вызовет метод ShowClassName помощника  TExampleClassHelper. 
  // Выведет сообщение: "Имя класса: TExample".
  Ex.MyFunc;    // Вызовет метод ExampleFunc помощника TExampleClassHelper. Вернет 1.
end;

Давайте попробуем написать помощника для типа Integer, в котором реализуем методы:
Inc(const Value: integer = 1) — прибавить указанное число Value к текущему числу. По умолчанию — 1.
Dec(const Value: integer = 1) — вычтит указанное число Value из текущего числа. По умолчанию — 1.
ToString — Переведет число в строку.

Код помощника:

type
  TIntegerHelper = record helper for integer
    procedure Inc(const Value: integer = 1);
    procedure Dec(const Value: integer = 1);
    function ToString: string;
  end;

implementation

{ TIntegerHelper }

procedure TIntegerHelper.Dec(const Value: integer);
begin
  Self := Self - Value;
end;

procedure TIntegerHelper.Inc(const Value: integer);
begin
  Self := Self + Value;
end;

function TIntegerHelper.ToString: string;
begin
  Result := IntToStr(Self);
end;

Теперь попробуем воспользоваться:

var
  i: integer;
begin
  i := 10;
  i.Inc;
  i.Dec(3);
  ShowMessage(i.ToString); // Выведет сообщение "8".
end;

Если у вас появились вопросы — пишите их в комментариях или на почту: info@asd-soft.ru
Всем удачи!

Статья добавлена в Delphi. Добавить ссылку в закладки.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *