2014-04-22 78 views
1

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

你可以做到这一点很容易的代价是使用RTTI。 – whosrdaddy

回答

5

赋值运算符不能在Delphi超载。

您将需要引入一种方法来执行复制。这可能如何完成的一个例子是TPersistent.Assign。从TPersistent派生并重写虚拟Assign方法来实现所需的功能将是完全合理的。

+0

什么是此任务的最佳编程方法?不是运营商超载? – Franz

+0

好吧,运算符重载不是我提到的选项。所以剩下的选择是引入一种方法。 –

+0

为B类添加一个新的mthode,我可以自己编写代码。这应该成为班级助手的更好的一部分吗? – Franz

3

下面是一个小例子,说明如何使用新样式RTTI(D2010和更高版本)进行此操作。 请注意,这是一个非常基本的例子,它只复制字段(不属性),并且对基本类最好(不要与TComponent一起使用),目标对象中的字段必须是相同的类型。 FYI,有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; 
+0

这使我可以将'TListBox'复制到'TTimer'。我不确定这是个好主意。另外,它如何对待引用的成员呢?浅拷贝?那是理想吗? –

+1

就像我在我的回答中所说的那样,这是一个非常基本的例子,最适用于PODO(或DTO)而非组件。仅供参考,这个答案没有回答OP的问题,因为字段名称不匹配... – whosrdaddy

相关问题