4

德尔福就像英国女王卫队。它不喜欢模棱两可,甚至可能会杀死以保护硬代码。但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 方法?

4

3 回答 3

6

无法对对象实例强制执行隐式强制转换或方法调用。

如果这是您控制的记录,那么您可以实现一个Implicit类运算符来执行转换为string.

您所指的问题讨论链接只是PrintStream.println(). 这依赖于String.valueOf()为任何对象提供字符串表示的能力,而这些对象又依赖于Object.toString(). 事实上,那里的讨论与 Javaprintln()中运算符的工作方式无关,+这是您问题中的相关问题。

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

于 2013-06-28T13:34:49.497 回答
4

如果您有一个类似 的特殊功能Format,您可以获得该行为。几年前我写了一个这样的函数,当时内置函数不支持 Unicode。我现在更新了它以支持ToString在对象作为%s格式字符串的参数传递时调用它。你会这样称呼它:

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

很抱歉,代码已经好几年没有真正被修改过,所以它在较新的 Delphi 版本中可能无法按原样工作。您必须决定是否值得努力更新该代码,尽管它包含在绝地计划中的时间足够长,以至于它确实获得了一些名义上的更新来支持UnicodeString和 64 位编译。

于 2013-06-28T13:44:18.197 回答
2

太糟糕了,它只能在 ARM 编译器和 Delphi.NET 上运行 Nick Hodges 在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;
于 2013-06-28T14:18:32.980 回答