如何使用DELPHI的运算符重载将数据从一个类复制到第二个类?
我的虚拟应用程序是这样的:
type
TClass_A = class
a: String;
end;
TClass_B = class(TClass_A)
b: String;
end;
implementation
procedure TForm1.Button1Click(Sender: TObject);
var
a: TClass_A;
b: TClass_B;
begin
a := TClass_A.Create;
b := TClass_B.create;
b := a; // <<-- What code should be here? Can I overload := operator?
end;
答案 0 :(得分:5)
赋值运算符不能在Delphi中重载。
您需要引入一种方法来执行复制。如何做到这一点的一个例子是TPersistent.Assign
。从TPersistent
派生并覆盖虚拟Assign
方法以实现所需的功能是完全合理的。
答案 1 :(得分:3)
以下是如何使用新式RTTI(D2010及更高版本)执行此操作的小示例。 请注意,这是一个非常基本的示例,它只复制字段(不是属性)并且最适合基本类(不要将它与TComponent一起使用),目标对象中的字段必须是相同的类型。仅供参考,那里有better examples:)
uses
Rtti,...
function CopyObject(const FromObj, ToObj: TObject): Boolean;
var
Ctx : TRTTIContext;
FromObjType : TRttiType;
ToObjType : TRttiType;
FromField : TRttiField;
ToField : TRttiField;
begin
Result := False;
FromObjType := Ctx.GetType(FromObj.ClassInfo);
ToObjType := Ctx.GetType(ToObj.ClassInfo);
for FromField in FromObjType.GetFields do
begin
ToField := ToObjType.GetField(FromField.Name);
if Assigned(ToField) then
begin
if ToField.FieldType = FromField.FieldType then
ToField.SetValue(ToObj, FromField.GetValue(FromObj));
Result := True;
end;
end;
end;