2013-07-27 33 views
9

我爲了創建這個幫手一些更多的功能添加到string類型:是否有可能爲字符串類型使用兩個記錄助手?

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

但是,當我在我的代碼中使用它,在System.StrUtils的​​「失控」,我無法使用它的功能。

它們能夠共存嗎?

+1

FWIW,Reverse是我認爲您的功能所使用的更常用的名稱。 –

+0

我以前也使用Reverse ... – PSyLoCKe

回答

11

至多有一個助手可以在代碼中的任何一個點上激活。該documentation這樣說:

您可以定義和使用單個 類型關聯多個幫手。但是,只有零個或一個幫助程序適用於源代碼中的任何 特定位置。 最近範圍內定義的幫手將適用。類或記錄幫助範圍是 以正常德爾福方式確定(例如,在單位的使用條款中留下的右邊的 )。

由於記錄幫助程序不支持繼承,因此除了重新實現標準幫助程序的功能外,沒有辦法同時激活標準幫助程序和輔助程序的功能。

+0

確實,重新實現將是最簡單的,只需使用TStringHelper函數來實現重新實現,IOW使用聚合而不是繼承。 –

+0

@RudyVelthuis:你的意思是重新實施?你能給個例子嗎? –

+0

只需編寫一個新的字符串助手並使用現有的字符串助手來實現它。問題是,一個助手不能有自己的實例變量,但。 –

2

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

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; 

但當然,那麼我們就可以問:爲什麼不寫一個普通的函數? :-)

無論如何,我喜歡這個方法的語法比傳統的函數/過程更好。

+0

因爲帥哥們認爲這個對象方法比較好,所以我們不應該把它們與直接函數調用混合使用。 : - / – PSyLoCKe

2

嘗試創建自己的類和輔助

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

使用TMyString而不是字符串。

要使用標準字符串幫助器將TMyString變量與String()一起包裝或使用ToString方法。

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