如何在Delphi对象或字符串中隐式使用ToString()



德尔斐就像一名英格兰女王卫队。它不喜欢歧义,甚至可能为了保护硬代码而杀人。但Java几乎是一个街角的女人。当我使用这是java:

 Button button = new Button();
 String a = "This is a " + button;

我得到This is a button

但如果我在Delphi:中这样做

 ShowMessage('This is a ' + Button1);

我得到一个错误,因为Delphi有toString()方法(现在),但它没有隐式调用它。因为文本字符串不是OP中的对象。正确的用法是:

 ShowMessage('This is a ' + Button1.toString());

有没有什么方法可以覆盖这个行为,使它像Java一样工作?

供参考:一个对象将如何隐式调用toString方法?

没有办法在对象实例上强制执行隐式强制转换或方法调用。

如果这是您控制的记录,那么您可以实现一个Implicit类运算符,该运算符将执行到string的强制转换。

您提到的问题讨论链接只是PrintStream.println()的一个实现细节。这取决于String.valueOf()为任何对象提供字符串表示的能力,而该对象又依赖于Object.toString()。事实上,关于println()的讨论与Java中+运算符的工作方式无关,后者是您问题中的相关问题。

Delphi的TObject有一个虚拟的ToString方法,可以用于执行相同的目的。因此,在Delphi代码中使用与PrintStream.println()完全相同的技术是很容易的。

如果你有一个像Format一样工作的特殊函数,你就可以得到这种行为。几年前,当内置函数不支持Unicode时,我写了一个这样的函数。我现在已经更新了它,以支持在对象作为%s格式字符串的参数传递时对其调用ToString。你可以这样称呼它:

ShowMessage(WideFormat('This is a %s', [Button1]));

很抱歉,这段代码已经好几年没有真正接触过了,所以它可能无法在较新的Delphi版本中正常工作。您必须决定是否值得更新该代码,尽管它在Project Jedi中包含的时间足够长,以至于它确实得到了一些名义上的更新,以支持UnicodeString和64位编译。

可惜它只能在ARM编译器和Delphi.NET上运行伟大的文章由尼克·霍奇斯在http://edn.embarcadero.com/article/34324

TMyClass = class
    class operator Add(a, b: TMyClass): TMyClass; // Addition of two operands of type TMyClass
    class operator Subtract(a, b: TMyClass): TMyclass; // Subtraction of type TMyClass
    class operator Implicit(a: Integer): TMyClass; // Implicit conversion of an Integer to type TMyClass
    class operator Implicit(a: TMyClass): Integer; // Implicit conversion of TMyClass to Integer
    class operator Explicit(a: Double): TMyClass; // Explicit conversion of a Double to TMyClass
end;
// Example implementation of Add class operator 
TMyClass.Add(a, b: TMyClass): TMyClass;
begin
  ...
end;
var
x, y: TMyClass
begin
  x := 12; // Implicit conversion from an Integer 
  y := x + x; // Calls TMyClass.Add(a, b: TMyClass): TMyClass 
  b := b + 100; // Calls TMyClass.Add(b, TMyClass.Implicit(100)) 
end;

最新更新