当将“增强记录”赋值给普通“数据类型”变量时,我需要重载哪个运算符?

4

首先,我需要知道我尝试做的事情是否可行。如果可行,我需要知道如何实现。

更好的方法是演示问题而不是解释它,所以让我们开始吧:

我有一个“增强记录”(目的是生成“智能字符串”类型来替换正常的字符串类型 - 虽然这对于这个问题并不重要):

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;

我现在可以按以下方式使用这个TLKString类型:
var
  LSmartString: TLKString;
begin
  LSmartString := 'Hello World'; // The "Implicit" operator then 
                                 // assigns this to LSmartString.Value
end;

好的,到目前为止一切都很棒!现在我们遇到了问题...

我需要能够将 LSmartString(TLKString 的“实例”)的值分配给普通的 String 变量...

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;

这是我遇到的问题,如你所见,上面代码段的最后一行导致了E2010 不兼容类型: 'string' 和 'TLKString'。当然,我知道这会发生...但我不知道是否可以通过在我的TLKString记录类型上重载运算符来克服这个问题,如果可以,我需要重载哪个运算符。
如果这不可能,那么CodeGear和Embarcadero没有为增强型记录类型分配值处理ImplicitExplicit运算符,但却没有处理相反情况的运算符,这让我感到有点愚蠢。
1个回答

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;

请接受您自己的答案。1. 这是一个好答案。2. 它将不再显示为需要答案 :) - Francesca
它不让我标记为已回答,还要等一天!这是 Stack Overflow 的限制。 - LaKraven

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接