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