私がやろうとしていることが可能であるかどうかをまず知る必要があります。それが可能な場合、私はどのように知る必要があります。「拡張レコード」を通常の「データ型」変数に割り当てるときに、どの演算子をオーバーロードしますか?
ので、ここで問題を示すのではなく、それを説明するためにはるかに簡単です行く:
私は「エンハンスド・レコード」(目的を持っている - この質問には重要ではないけれども - 「スマート文字列」タイプを生成することです、通常の文字列型を置き換えるために):次のように私は今、この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レコードタイプで演算子を多重定義することによって克服することができるかどうかわからない場合は、それを行うためにどの演算子をオーバーロードする必要があります。
これが不可能な場合は、それが機能拡張されたレコードタイプが、逆を処理するために、無オペレータに値の割り当てを処理するためにImplicit
とExplicit
演算子を持っているのCodeGearとエンバカデロの少し愚かとして私を打ちます。
あなた自身の答えを受け入れてください。 1.それは良いものです2.それはもう必要ではないと表示されます:) –
それは別の日のためにそれをマークすることはできません!スタックオーバーフローの制限 – LaKraven