2011-12-09 4 views
4

私がやろうとしていることが可能であるかどうかをまず知る必要があります。それが可能な場合、私はどのように知る必要があります。「拡張レコード」を通常の「データ型」変数に割り当てるときに、どの演算子をオーバーロードしますか?

ので、ここで問題を示すのではなく、それを説明するためにはるかに簡単です行く:

私は「エンハンスド・レコード」(目的を持っている - この質問には重要ではないけれども - 「スマート文字列」タイプを生成することです、通常の文字列型を置き換えるために):次のように私は今、このTLKStringタイプを使用することができます

TLKString = record 
    Value: String; 
    // Some methods here to operate on and build String values 

    // Allows me to assign String values directly to "instances" 
    // of this record type! I have others (hence "overload") to 
    // handle other data types (such as Integer etc.) 
    class operator Implicit(const AValue: String): TLKString; overload; 
end; 

var 
    LSmartString: TLKString; 
begin 
    LSmartString := 'Hello World'; // The "Implicit" operator then 
           // assigns this to LSmartString.Value 
end; 

オーケーを、これまでのところすべてが素晴らしいです!今、私たちは、これはどこで

var 
    LSmartString: TLKString; 
    LNormalString: String; 
begin 
    LSmartString := 'Hello World'; 

    // The next line works fine, but is not what I want! 
    LNormalString := LSmartString.Value; 
    LNormalString := LSmartString; // E2010 (Incompatible Types) 
end; 

...私は、通常の文字列変数にLSmartString(TLKStringの「インスタンス」)の値を割り当てることができるようにする必要があります...問題に

を取得します上記のスニップ結果の最後の行は、E2010互換性のない型: 'string'と 'TLKString'になります(私は気づくでしょう)。私はもちろん、これが事実であることを知っていました...私のTLKStringレコードタイプで演算子を多重定義することによって克服することができるかどうかわからない場合は、それを行うためにどの演算子をオーバーロードする必要があります。

これが不可能な場合は、それが機能拡張されたレコードタイプが、逆を処理するために、無オペレータに値の割り当てを処理するためにImplicitExplicit演算子を持っているのCodeGearとエンバカデロの少し愚かとして私を打ちます。

答えて

6

さて、私はこれに自分自身で答えました...そして、それは私が「ぼんやりと明白な」と呼ぶものでした。

ここでは(他人の利益のために)ソリューションです

TLKString = record 
    Value: String; 
    // Some methods here to operate on and build String values 
    class operator Implicit(const AValue: String): TLKString; overload; // handles String to TLKString assignment 
    class operator Implicit(const AValue: TLKString): String; overload; // handles TLKString to String assignment! THIS IS THE ANSWER! 
end; 
+0

あなた自身の答えを受け入れてください。 1.それは良いものです2.それはもう必要ではないと表示されます:) –

+0

それは別の日のためにそれをマークすることはできません!スタックオーバーフローの制限 – LaKraven

関連する問題