请问如何实现类的深度拷贝(100分)

  • 主题发起人 主题发起人 hz1982
  • 开始时间 开始时间
H

hz1982

Unregistered / Unconfirmed
GUEST, unregistred user!
请问如何实现“DestObj.Assign(SourceObj)”方法,或者有其它的拷贝方法
 
读读VCL的源码吧,自然会明白。

procedure TFont.Assign(Source: TPersistent);
begin
if Source is TFont then
begin
Lock;
try
TFont(Source).Lock;
try
FontManager.AssignResource(Self, TFont(Source).FResource);
Color := TFont(Source).Color;
if PixelsPerInch <> TFont(Source).PixelsPerInch then
Size := TFont(Source).Size;
finally
TFont(Source).Unlock;
end;
finally
Unlock;
end;
Exit;
end;
inherited Assign(Source);
end;
 
就是全面赋值。
 
有的也可以直接赋值
 
creation-zy 还是误导
大部分类的Assign方法都没有实现,直接调用TPersistent的assgign。
如果你想使用assgign的方法,只能在自己的类中实现assgignto的方法,
看好了是assgignto。
在assgignto中你就把私有字段的值一条条赋值吧,如果这个字段也是类
那么递归当前的方法吧。

其他的方法就是利用delphi类中特有的published。
自动获取puhished中属性的值来进行串行化。
客观的讲delphi类的复制真的麻烦。
 
不赞同apiao——只能在自己的类中实现assgignto的方法!
在TPersistent中,Assign,AssignTo都是虚方法,同时可以override这个Assign来实现复制操作。
procedure Assign(Source: TPersistent)
virtual;
procedure AssignTo(Dest: TPersistent)
virtual;
不过,从Delphi的原意来说,因为public的Assign调用的就是protected的AssignTo,override这AssignTo更好体现结构合理和类封装的优美。
 
后退
顶部