如何将数据从一个类复制到另一个类

时间:2014-04-22 13:18:44

标签: 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;
begin
  a := TClass_A.Create;
  b := TClass_B.create;

  b := a;  // <<-- What code should be here? Can I overload := operator?
end;

2 个答案:

答案 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;