当前的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.
显然你也可以有“记录助手”,但我自己从未尝试过。
您可以在 Delphi(自 Delphi 2006 起)中仅对不在类上的记录使用运算符重载,也不能对字符串等内置本机类型使用运算符重载。
原因是 Delphi 没有垃圾回收,因此运算符重载仅限于值类型(不在堆上的类型)。
您可以在CodeRage III 重播下载页面下载我的会话“具有记录、方法和运算符重载的可空类型”的重播。只需搜索会话名称。
还有一个页面可以下载会话示例和幻灯片。
它包含很多可以帮助您前进的示例,包括 Delphi 2006 编译器中已在 Delphi 2007 及更高版本中解决的一些问题的描述。
另请参阅此问题:我可以在 Delphi 中为我自己的类重载运算符吗?
编写自定义函数/过程不是更好的解决方案吗?
例如
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');
高温高压