Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Class 如何将数据从一个类复制到另一个类_Class_Delphi - Fatal编程技术网

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

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

如何使用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;

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的问题,因为字段名称不匹配。。。