我有一个从 TPersistent 三级继承的对象,我想使用 Assign 克隆它程序。
MyFirstObj := GrandSonOfPersistent.Create();
//I modify the objects inside MyFirstObj
MySecondObj := GrandSonOfPersistent.Create();
MySecondObj.Assign(MyFirstObject);
我如何检查它是否有效? 当对象有很多其他对象时,它是否有效?
我正在尝试克隆一个对象,这是正确的方法吗?
最佳答案
Assign
是一个虚方法。从 TPersistent
继承的任何后代类都应该覆盖 Assign
以处理添加到基类顶部的任何新成员的深度复制。如果您的类没有覆盖 Assign
来处理这些深拷贝,那么使用 Assign
进行这样的拷贝将不会成功。 Assign
的基本实现调用 AssignTo
,它尝试使用源对象的实现来执行复制。如果源对象和目标对象都不能处理副本,则会引发异常。
例如:
unit SomeUnit;
interface
uses Classes;
type
TMyPersistent = class(TPersistent)
private
FField: string;
public
property Field: string read FField write FField;
procedure Assign (APersistent: TPersistent) ; override;
end;
implementation
procedure TMyPersistent.Assign(APersistent: TPersistent) ;
begin
if APersistent is TMyPersistent then
Field := TMyPersistent(APersistent).Field
else
inherited Assign (APersistent);
end;
end.
请注意,任何继承自 TPersistent
的类如果无法处理 Assign
调用,则只能调用 inherited
。但是,后代类应该始终调用 inherited,因为父类也可能有要执行的操作,如果没有,将处理传递给基类 inherited
的调用:
type
TMyOtherPersistent = class(TMyPersistent)
private
FField2: string;
public
property Field2: string read FField2 write FField2;
procedure Assign (APersistent: TPersistent) ; override;
end;
implementation
procedure TMyPersistent.Assign(APersistent: TPersistent) ;
begin
if APersistent is TMyOtherPersistent then
Field2 := TMyOtherPersistent(APersistent).Field2;
inherited Assign (APersistent);
end;
在这个例子中,我展示了字符串。对于对象成员,您需要使用它们的 Assign
方法或以其他方式执行复制。
关于delphi - 我可以使用分配来复制对象的对象吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23163655/