问题:Delphi对象的拷贝和结构的拷贝 ( 积分:0, 回复:2, 阅读:47 )
分类:控件 - 开发 ( 版主:cAkk, amo )
来自:zjfeng, 时间:2002-11-23 22:13:00, ID:1454582 [显示:小字体 | 大字体]
这几天对Delphi 的编程有了一点更深入的了解,写一点心得。
Delphi中间对象的赋值是通过引用来实现的,这一点,大家应该都明白,那么
如果实现深拷贝呢!?引大富翁的一个贴子大家自然就明白了,可是我的心得是用
结构体是对象的浅拷贝,而不是通过引用来实现的。这是我的一部分代码
TDataHead = record
DataType: longint; //段类型
Author: array[0..15] of char; //作者
PubDate: TDateTime; //收录日期
Key: DWORD; //密钥
Num: longint; //附件数量
SearchKey: array[0..51] of char; //关键词
Pass
word: 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_paste, 时间:2002-11-23 22:20:00, ID:1454593
结构copy,就是Move啦,比较就用CompareMem啦,对象如果支持赋值的话,是从TPersistent
继承的,所以不要继承TObject(MyClass=class为TObject父类),然后override Assign方法
就行了.
来自:zjfeng, 时间:2003-1-6 1:54:00, ID:1562336
接受答案了.