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都不支持运算符重载。
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都不支持运算符重载。