繁体   English   中英

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

[英]How to use ToString() implicitly in Delphi objects or strings?

德尔福就像英格兰女王卫队。 它不喜欢歧义,甚至可能会杀死以保护硬代码。 但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很棒的文章,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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM