Можно ли использовать два помощника записи для строкового типа?
Я создал этот помощник, чтобы добавить еще несколько функций 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
Синтаксис метода лучше, чем традиционная функция / процедура.