[英]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.