这是您的问题的主题,涉及通过类和记录助手扩展记录和类类型的功能。根据 Embarcadero 的文档,您可以扩展类或记录(但助手不支持运算符重载)。所以基本上你可以根据成员方法扩展功能,但没有成员数据)。它们支持您可以通过 getter 和 setter 以通常的方式访问的类字段,尽管我没有对此进行测试。如果您想通过接口访问要添加助手的类或记录的数据,您可能可以实现这一点(即,当原始类或记录的成员数据发生更改时触发事件或信号)。虽然您无法实现数据隐藏,但它确实允许您覆盖原始类的现有成员函数。
例如。此示例适用于 Delphi XE4。创建一个新的 VCL Forms 应用程序并将 Unit1 中的代码替换为以下代码:
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes,
Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, System.Types;
type
TMyArray2D = array [0..1] of single;
TMyVector2D = record
public
function Len: single;
case Integer of
0: (P: TMyArray2D);
1: (X: single;
Y: single;);
end;
TMyHelper = record helper for TMyVector2D
function Len: single;
end;
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
implementation
function TMyVector2D.Len: Single;
begin
Result := X + Y;
end;
function TMyHelper.Len: single;
begin
Result := Sqrt(Sqr(X) + Sqr(Y));
end;
procedure TestHelper;
var
Vec: TMyVector2D;
begin
Vec.X := 5;
Vec.Y := 6;
ShowMessage(Format('The Length of Vec is %2.4f',[Vec.Len]));
end;
procedure TForm1.Form1Create(Sender: TObject);
begin
TestHelper;
end;
请注意,结果是 7.8102 而不是 11。这表明您可以使用类或记录助手隐藏原始类或记录的成员方法。
因此,在某种程度上,您只需处理对原始数据成员的访问,就像您在声明类的单元中更改值一样,通过更改属性而不是直接更改字段,以便适当的操作由该数据的 getter 和 setter 获取。
感谢您提出问题。在尝试寻找答案的过程中,我当然学到了很多东西,这对我也有很大帮助。
布赖恩·约瑟夫·约翰斯