Можно ли использовать два помощника записи для строкового типа?

Я создал этот помощник, чтобы добавить еще несколько функций string тип:

type
  AStringHelper = record helper for string
    function Invert: string; overload;
    function InvertMe: string; overload;
  end;

Но когда я использую его в своем коде, TStringHelper в System.StrUtils "выходит", и я не могу использовать его функции.

Возможно ли им обоим сосуществовать?

3 ответа

Решение

Максимум один помощник может быть активным в любой точке вашего кода. Документация говорит это:

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

Поскольку помощники записи не поддерживают наследование, невозможно одновременно активировать функции стандартного помощника и вашего помощника, за исключением повторной реализации функциональности стандартного помощника.

Попробуйте создать свой собственный класс и помощник

TMyString = type string;
TMyStringHelper = record helper for TMyString 
  function Invert: TMyString; 
  function ToString: string;
end;

Используйте TMyString вместо String.

Чтобы использовать стандартные помощники String, оберните переменную TMyString с помощью String() или используйте метод ToString.

var
  S1: TMyString;
  S2: String;
begin
  S1 := ' 123456 ';
  S1.Invert;
  S2 := String(S1).Trim;
  S2 := S1.ToString.Trim;
end;

Другая возможность - использовать опцию "Список предков", предложенную помощниками.

Syntaxis:

type
identifierName = class|record helper [(ancestor list)] for TypeIdentifierName
  memberList
end;

И используйте так:

Unit1:   
THelperBase = Class helper for TMyClass
Public
  Function SayHello;
end;

Unit2:
Uses Unit1;
THelperChild = Class helper (THelperBase) for TMyClass
Public
  Function SayGoodBye;
end;

И, наконец, в вашем коде:

Uses Unit2;   

Var MyClass: TMyclass;   

MyClass:= TMyclass.Create;
MyClass.SayHello; //valid
MyClass.SayGoodBye; //valid

Простое решение этого может быть:

type
  TStr = record
  private
    FStr:string;
  public
    function Invert: string; overload;
    function InvertMe: string; overload;
  end;

Используя приведение типов, вы можете получить доступ к функциям на TStr на обычном string переменная:

var
  s1,s2:string;
begin
  s1:='123456';
  s2:=TStr(s1).invert;
end;

Но, конечно, тогда мы можем спросить: почему бы просто не написать обычную функцию?:-)

Во всяком случае, мне это нравится class / object / record Синтаксис метода лучше, чем традиционная функция / процедура.

Другие вопросы по тегам