2013-07-27 13 views
9

私はstring型にいくつかのより多くの機能を追加するために、このヘルパーを作成しました:文字列型に2つのレコードヘルパーを使用できますか?

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

しかし、私は私のコードでそれを使用する場合、System.StrUtilsで​​は「アウトを取得」と私はそれの機能を使用することはできません。

両者を共存させることはできますか?

+1

FWIW、Reverseは、私があなたの機能と考えるもののより一般的な名前です。 –

+0

私はリバースも使用していました... – PSyLoCKe

答えて

11

コード内の任意の1点で最大1人のヘルパーがアクティブになることができます。 documentationはこれを言う:

あなたは、単一の タイプで複数のヘルパーを定義して関連付けることができます。ただし、 ソースコード内の特定の場所には、0または1人のヘルパーしか適用されません。最も近いスコープの で定義されているヘルパーが適用されます。クラスまたはレコードのヘルパースコープは、通常のDelphiの方法で決定された です(たとえば、ユニットのuses節の右側にある )。

レコードヘルパーは、継承をサポートしていないので、再実装標準ヘルパーの機能以外の標準的なヘルパーのと同時にアクティブあなたのヘルパーの機能の両方を持ってする方法はありません。これに

+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; 

しかし、もちろんのなぜ普通の関数を書くのではないのですか? :-)

とにかく、私はこれが好きです。class/object/record従来の関数/プロシージャよりもメソッド構文が優れています。

+0

このオブジェクトメソッドの方法が優れていると思うので、それらを直接関数呼び出しと組み合わせて使用​​しないでください。 : - / – PSyLoCKe

2

独自のクラスを作成しようとヘルパー

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; 
関連する問題