Это тема вашего вопроса и относится к расширению функциональности записей и типов классов с помощью классов и помощников записей. Согласно документации Embarcadero об этом вы можете расширить класс или запись (но перегрузка операторов не поддерживается помощниками). Таким образом, вы можете расширить функциональность с точки зрения методов-членов, но без данных-членов). Они поддерживают поля классов, к которым вы можете обращаться через методы получения и установки обычным способом, хотя я не проверял это. Если вы хотите связать доступ к данным класса или записи, к которой вы добавляете помощника, вы, вероятно, могли бы достичь этого (т. Е. Инициировать событие или сигнал, когда данные члена исходного класса или записи были изменены). Вы не можете реализовать скрытие данных, но это позволяет переопределить существующую функцию-член исходного класса.
например. Этот пример работает в 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. Это показывает, что вы можете скрыть методы-члены исходного класса или записи с помощью класса или помощника записей.
Таким образом, вы бы просто относились к доступу к исходным элементам данных точно так же, как при изменении значений внутри модуля, в котором объявлен класс, путем изменения через свойства, а не непосредственно через поля, поэтому соответствующие действия принимаются получателями и установщиками этих данных.
Спасибо, что задали вопрос. Я, конечно, многому научился, пытаясь найти ответ, и это мне тоже очень помогло.
Брайан Джозеф Джонс