Delphi对象的拷贝和结构的拷贝(0分)

  • 主题发起人 主题发起人 zjfeng
  • 开始时间 开始时间
Z

zjfeng

Unregistered / Unconfirmed
GUEST, unregistred user!
这几天对Delphi 的编程有了一点更深入的了解,写一点心得。
Delphi中间对象的赋值是通过引用来实现的,这一点,大家应该都明白,那么
如果实现深拷贝呢!?引大富翁的一个贴子大家自然就明白了,可是我的心得是用
结构体是对象的浅拷贝,而不是通过引用来实现的。这是我的一部分代码
TDataHead = record
DataType: longint; //段类型
Author: array[0..15] of char; //作者
PubDate: TDateTime; //收录日期
Key: DWORD; //密钥
Num: longint; //附件数量
SearchKey: array[0..51] of char; //关键词
Password: array[0..11] of char; //口令
Keep: longint; //保留字段 //已经连上文件附件了
end;
Srm.DataHead:= SrmImport.DataHead;//DataHead是这个TDataHead类型的
if @Srm.DataHead=@SrmImport.DataHead then
showmessage('equal!');
经过测试,不显示equal.说明不是引用,而值的确相等


这是大富翁的贴子:
看看下面的代码,你就理解Delphi是怎么实现对象拷贝的了,Delphi确实就
是这么做的!

program Project1;
{$APPTYPE CONSOLE}
uses SysUtils;

type
TG1 = class
procedure Assign(Src: TG1); virtual; abstract;
end;

TF1 = class(TG1)
Age: Integer;
procedure Assign(Src: TG1); override;
end;

TF2 = class(TG1)
Color: Integer;
procedure Assign(Src: TG1); override;
end;

TSon = class(TF1)
Length: Integer;
procedure Assign(Src: TG1); override;
end;

{ TF1 }

procedure TF1.Assign(Src: TG1);
begin
inherited;
if Src is TF1 then
Age := (Src as TF1).Age;
end;

{ TF2 }

procedure TF2.Assign(Src: TG1);
begin
inherited;
if Src is TF2 then
Color := (Src as TF2).Color;
end;

{ TSon }

procedure TSon.Assign(Src: TG1);
begin
inherited;
if Src is TSon then
Length := (Src as TSon).Length;
end;

var
Father: TF1;
Uncle: TF2;
You: TSon;
begin
Father := TF1.Create; Father.Age := 88;
Uncle := TF2.Create; Uncle.Color := 100;
You := TSon.Create;

You.Assign(Father); //你知道这句干了什么吗?
You.Assign(Uncle); //你知道这句又干了什么吗?

Father.Assign(Uncle); //这句呢?
Father.Assign(You); //???

Uncle.Assign(Father); //??
Uncle.Assign(You); //??

Father.Free; Uncle.Free; You.Free;
end.


只不过你非要用赋值的方式来“Copy”对象,才能满足你的“心理”拟或“生理”
需求吗?
C++能这么做,是因为它支持运算符重载,即使你自己没有重载“=”运算符,在你
进行对象间赋值时,
C++也帮你重载了,并调用了缺省的“拷贝构造函数”。
而“运算符重载”已被公认为“弊大于利”,好象C#和JAVA都不支持运算符重载。
 
结构copy,就是Move啦,比较就用CompareMem啦,对象如果支持赋值的话,是从TPersistent
继承的,所以不要继承TObject(MyClass=class为TObject父类),然后override Assign方法
就行了.
 
接受答案了.
 
后退
顶部