【问题标题】:How to copy data from one class into another class如何将数据从一个类复制到另一个类
【发布时间】:2014-04-22 13:18:44
【问题描述】:

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

【问题讨论】:

  • 您可以轻松做到这一点,但需要使用 RTTI。

标签: class delphi


【解决方案1】:

Delphi 中不能重载赋值运算符。

您需要介绍一种方法来执行复制。如何做到这一点的一个例子是TPersistent.Assign。从TPersistent 派生并覆盖虚拟Assign 方法以实现所需的功能是完全合理的。

【讨论】:

  • 这个任务最好的编程方法是什么?不是运算符重载?
  • 好吧,正如我提到的,运算符重载不是一个选项。所以剩下的选择就是引入一个方法。
  • 为B类添加一个新的mthode,我可以自己写代码。这应该是类助手的更好部分吗?
  • 当你不能自己扩展类时使用类助手。如果这些是您的类,请不要使用助手。
  • TPersistent.Assign,你能扩展给定的示例代码吗?
【解决方案2】:

这里有一个小例子,说明如何使用新型 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;

【讨论】:

  • 这允许我将TListBox 复制到TTimer。我不确定这是不是个好主意。另外,它如何对待引用的成员?浅拷贝?那是理想的吗?
  • 就像我在回答中所说的那样,这是一个非常基本的示例,最适合用于 PODO(或 DTO)而不是组件。仅供参考,此答案不回答 OP 的问题,因为字段名称不匹配...
猜你喜欢
  • 2013-03-18
  • 2010-11-15
  • 1970-01-01
  • 1970-01-01
  • 2012-03-06
  • 2019-10-15
  • 1970-01-01
  • 2021-10-19
  • 1970-01-01
相关资源
最近更新 更多