delphi - 我可以使用分配来复制对象的对象吗?

标签 delphi clone

我有一个从 TPersistent 三级继承的对象,我想使用 Assign 克隆它程序。

MyFirstObj := GrandSonOfPersistent.Create();
//I modify the objects inside MyFirstObj
MySecondObj := GrandSonOfPersistent.Create();
MySecondObj.Assign(MyFirstObject);

我如何检查它是否有效? 当对象有很多其他对象时,它是否有效?

我正在尝试克隆一个对象,这是正确的方法吗?

最佳答案

Assign 是一个虚方法。从 TPersistent 继承的任何后代类都应该覆盖 Assign 以处理添加到基类顶部的任何新成员的深度复制。如果您的类没有覆盖 Assign 来处理这些深拷贝,那么使用 Assign 进行这样的拷贝将不会成功。 Assign 的基本实现调用 AssignTo,它尝试使用源对象的实现来执行复制。如果源对象和目标对象都不能处理副本,则会引发异常。

参见:The Documentation

例如:

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/

相关文章:

无法在 T 中访问类 Object 中的 Scala 方法克隆 不允许访问 protected 方法克隆,因为

JQuery 克隆不保留单选和选择状态

delphi - 64 位 delphi 应用程序中的 {$SetPEFlags IMAGE_FILE_LARGE_ADDRESS_AWARE}

c# - 从 C# 克隆 Mercurial 存储库?

c - TDataset --> 指向行列矩阵的指针?

delphi - 为什么 Delphi 变体不能保存对象?

git - 如何将本地分支 rebase 到远程主机

java - arraylist 的副本不断被修改为原始值

delphi - 如何使 QR 页面页脚或带位于带详细信息下方而不是页面末尾?

delphi - 如何更改 Delphi 2010 IDE 中编辑器选项卡的字体大小?