Class 如何将数据从一个类复制到另一个类
如何使用DELPHI中的运算符重载将数据从一个类复制到第二个类 我的虚拟应用程序如下所示:Class 如何将数据从一个类复制到另一个类,class,delphi,Class,Delphi,如何使用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; begi
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;
Delphi中不能重载赋值运算符
您需要引入一种方法来执行复制。TPersistent.Assign就是一个如何实现这一点的示例。从TPersistent派生并重写virtual Assign方法以实现所需的功能是完全合理的。在Delphi中不能重载赋值运算符
您需要引入一种方法来执行复制。TPersistent.Assign就是一个如何实现这一点的示例。从TPersistent派生并重写virtual Assign方法以实现所需的功能是完全合理的。下面是一个小示例,说明如何使用新型RTTI D2010及更高版本实现此功能。 请注意,这是一个非常基本的示例,它只复制字段而不复制属性,最适用于基本类。不要将此用于TComponent,目标对象中的字段必须是相同的类型。仅供参考,这里有:
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;
下面是一个如何使用新型RTTI D2010及更高版本实现这一点的小示例。 请注意,这是一个非常基本的示例,它只复制字段而不复制属性,最适用于基本类。不要将此用于TComponent,目标对象中的字段必须是相同的类型。仅供参考,这里有:
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;
这项任务的最佳编程方法是什么?不是运算符重载吗?嗯,运算符重载不是我提到的选项。所以剩下的选项是引入一个方法。为类B添加一个新的方法,我可以自己编写代码。这应该是类帮助器更好的一部分吗?当您自己无法扩展类时,请使用类帮助器。如果这些是您的类,请不要使用helpers.TPersistent.Assign,您可以扩展给定的示例代码吗?对于此任务,最好的编程方法是什么?不是运算符重载吗?嗯,运算符重载不是我提到的选项。所以剩下的选项是引入一个方法。为类B添加一个新的方法,我可以自己编写代码。这应该是类帮助器更好的一部分吗?当您自己无法扩展类时,请使用类帮助器。如果这些是您的类,请不要使用helpers.TPersistent.Assign,您可以扩展给定的示例代码吗?您可以很容易地做到这一点,但要付出使用RTTI的代价。这允许我将TListBox复制到TTimer。我不确定这是不是一个好主意。另外,它如何处理作为引用的成员?浅拷贝?这是否理想?正如我在回答中所说,这是一个非常基本的示例,最好用于PODO或DTO,而不是用于组件。仅供参考,此答案不回答OP的问题,因为字段名称不匹配…这允许我将TListBox复制到TTimer。我不确定这是不是一个好主意。另外,它如何处理作为引用的成员?浅拷贝?这是否理想?正如我在回答中所说,这是一个非常基本的示例,最好用于PODO或DTO,而不是用于组件。仅供参考,此答案不回答OP的问题,因为字段名称不匹配。。。