簡體   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