現在の Delphi で実装する方法はありますか。
a) 演算子のオーバーロード (+、=) を持つ文字列 (クラスとして)
b) カスタム文字列メソッドを追加できるクラス ヘルパー
文字列はネイティブ型であるため、クラスヘルパーはクラスなどを設定しないと機能しません。
現在の Delphi で実装する方法はありますか。
a) 演算子のオーバーロード (+、=) を持つ文字列 (クラスとして)
b) カスタム文字列メソッドを追加できるクラス ヘルパー
文字列はネイティブ型であるため、クラスヘルパーはクラスなどを設定しないと機能しません。
はい、文字列は、特別なコンパイラ マジックが追加されたネイティブ型です。
どの演算子のオーバーロードが必要かわかりません。+ と = は、連結演算子と等価演算子として既に機能しています。
しかし、私は自分で似たようなことをすることを考えました。暗黙的なコンバーターとオーバーロードされた add および equals 演算子を含むレコード型で機能する可能性があります (Win32 Delphi では、レコードにのみ演算子のオーバーロードを含めることができます。これは D2006 (?2005) でのみ使用できます。)
パフォーマンスの影響もあると思います。
構文は次のようになります。
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
TString = record
private
Value : string;
public
class operator Add(a, b: TString): TString;
class operator Implicit(a: Integer): TString;
class operator Implicit(const s: string): TString;
class operator Implicit(ts: TString): String;
function IndexOf(const SubStr : string) : Integer;
end;
var
Form1: TForm1;
implementation
class operator TString.Add(a, b : TString) : TString;
begin
Result.Value := a.Value + b.Value;
end;
class operator TString.Implicit(a: Integer): TString;
begin
Result.Value := IntToStr(a);
end;
class operator TString.Implicit(ts: TString): String;
begin
Result := ts.Value;
end;
function TString.IndexOf(const SubStr : string) : Integer;
begin
Result := Pos(SubStr, Value);
end;
class operator TString.Implicit(const s: string): TString;
begin
Result.Value := s;
end;
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
ts : TString;
begin
ts := '1234';
ShowMessage(ts);
ShowMessage(IntToStr(Ts.IndexOf('2')));
end;
end.
どうやら「レコードヘルパー」も使えるようですが、私は自分で試したことはありません。
カスタム関数/プロシージャを作成するためのより良いソリューションではありませんか?
例えば
Function StrToBase64(AString): string;
Procedure StrToGridLayout(AString: string; AGrid: TDBGrid);
Function ExtractWord(aString): string;
Function GetStrColumn(aString: string; aCol: integer): string;
また、同じユニットにあるこれらの関数/プロシージャを機能カテゴリにグループ化する場合は、次のレコードを使用できます。
TStringConversions = record
class Function StrToBase64(AString): string;
class Procedure StrToGridLayout(AString: string; AGrid: TDBGrid);
end;
TStringParsing = record
class Function ExtractWord(aString): string;
class Function GetStrColumn(aString: string; aCol: integer): string;
end;
そして、はるかにクリーンな方法でコードでそれらを呼び出すことができます。
myFirstWord := TStringParsing.ExtractWord('Delphi is a very good tool');
HTH
Delphi では(Delphi 2006 以降)演算子のオーバーロードをクラスではなくレコードに対してのみ使用でき、文字列などの組み込みのネイティブ型に対しては使用できません。
その理由は、Delphi にはガベージ コレクションがないため、演算子のオーバーロードは値型 (ヒープ上に存在しない型) に限定されるためです。
私のセッション「Nullable Types with Records, Methods and Operator Overloading」のリプレイは、CodeRage III Replay ダウンロード ページからダウンロードできます。セッション名を検索するだけです。
セッションのサンプルとスライドをダウンロードできるページもあります。
これには、Delphi 2007 以降で解決された Delphi 2006 コンパイラのいくつかの問題の説明を含む、かなりの数の例が含まれています。
この質問も参照してください: Delphi で自分のクラスの演算子をオーバーロードできますか?