簡體   English   中英

字符串類型可以使用兩個記錄助手嗎?

[英]Is it possible to use two record helpers for the string type?

我創建此幫助程序是為了向string類型添加更多功能:

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

但是,當我在代碼中使用它時, System.StrUtilsTStringHelper會“退出”並且無法使用它的功能。

他們是否可以共存?

您的代碼中的任何一點最多只能有一個助手。 文件說:

您可以使用單個類型定義和關聯多個助手。 但是,在源代碼中的任何特定位置僅適用零個或一個輔助函數。 在最接近的范圍內定義的幫助程序將適用。 類或記錄幫助程序的作用域以常規的Delphi方式確定(例如,在該單元的uses子句中從右到左)。

由於記錄助手不支持繼承,因此除了重新實現標准助手的功能外,無法同時激活標准助手和您的助手功能。

嘗試創建自己的班級和助手

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

使用TMyString而不是String。

要使用標准的字符串幫助器,請在TMyString變量中加上String()或使用ToString方法。

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

一個簡單的解決方案可能是:

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

通過使用類型轉換,您可以在普通string變量上訪問TStr上的函數:

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

但是,當然,我們可以問:為什么不編寫普通的函數呢? :-)

無論如何,我比傳統的函數/過程更喜歡這種class / object / record方法的語法。

另一種可能性是使用助手提供的“祖先列表”選項

句法:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM