4

Delphi は、イングランドのクイーン ガードのようなものです。あいまいさが嫌いで、ハードコードを保護するために殺すことさえあります。しかし、Java はほとんど街角の女性です。私がこれを使用するときはJavaです:

 Button button = new Button();
 String a = "This is a " + button;

私は得るThis is a button

しかし、Delphi でそれを行うと、次のようになります。

 ShowMessage('This is a ' + Button1);

toString()Delphi にはメソッド (現在) がありますが、暗黙的に呼び出すわけではないため、エラーが発生します。リテラル文字列は 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 バージョンではそのままでは機能しない可能性があります。そのコードを更新する価値があるかどうかを判断する必要がありますが、Project Jedi に含まれていたため、サポートUnicodeStringと 64 ビット コンパイルのためのいくつかの名目上の更新が行われました。

于 2013-06-28T13:44:18.197 に答える
2

ARM コンパイラと Delphi.NET でしか動作しないのは残念ですhttp://edn.embarcadero.com/article/34324の Nick Hodges による素晴らしい記事

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 に答える