gpt4 book ai didi

delphi - 在我的特定类中实现Clone()的最佳方法

转载 作者:行者123 更新时间:2023-12-03 18:44:41 29 4
gpt4 key购买 nike

在特定的TPersistent类中,我想提供一个Clone函数,该函数返回对象的独立副本。

是否有可能使它与子代一起正常工作,而无需在每个子代中都实现Clone功能?

这与克隆任何未知字段或深度克隆(可以使用RTTI完成)无关。在下面的最小示例中,您可以看到要放置Clone函数的位置。

由于它使用Assign()复制数据,因此可以与任何后代一起使用。问题是构造函数,请参见注释。如何调用该子代的正确构造函数?如果很难做到这一点,可以假设没有任何后代也可以覆盖构造函数而不覆盖Clone

program Test;

uses System.SysUtils, System.Classes;

type
TMyClassBase = class abstract(TPersistent)
public
constructor Create; virtual; abstract;
function Clone: TMyClassBase; virtual; abstract;
end;

TMyClassBase<T> = class abstract(TMyClassBase)
private
FValue: T;
public
constructor Create; overload; override;
function Clone: TMyClassBase; override;
procedure Assign(Source: TPersistent); override;
property Value: T read FValue write FValue;
end;

TMyClassInt = class(TMyClassBase<Integer>)
public
function ToString: string; override;
end;

TMyClassStr = class(TMyClassBase<string>)
public
function ToString: string; override;
end;

constructor TMyClassBase<T>.Create;
begin
Writeln('some necessary initialization');
end;

procedure TMyClassBase<T>.Assign(Source: TPersistent);
begin
if Source is TMyClassBase<T> then FValue:= (Source as TMyClassBase<T>).FValue
else inherited;
end;

function TMyClassBase<T>.Clone: TMyClassBase;
begin
{the following works, but it calls TObject.Create!}
Result:= ClassType.Create as TMyClassBase<T>;
Result.Assign(Self);
end;

function TMyClassInt.ToString: string;
begin
Result:= FValue.ToString;
end;

function TMyClassStr.ToString: string;
begin
Result:= FValue;
end;

var
ObjInt: TMyClassInt;
ObjBase: TMyClassBase;
begin
ObjInt:= TMyClassInt.Create;
ObjInt.Value:= 42;
ObjBase:= ObjInt.Clone;
Writeln(ObjBase.ToString);
Readln;
ObjInt.Free;
ObjBase.Free;
end.


输出是

some necessary initialization
42


因此,正确的类出来了,在这个最小的示例中它可以正常工作,但是不幸的是,我未完成必要的初始化(应该出现两次)。

希望我能说得清楚,并且您喜欢我的示例代码:)-我还要感谢任何其他注释或改进。我的 Assign()实现可以吗?

最佳答案

您无需使非通用基类构造函数抽象。您可以在那里实现克隆,因为您具有虚拟构造函数。

此外,您无需将Clone方法虚拟化。

type
TMyClassBase = class abstract(TPersistent)
public
constructor Create; virtual; abstract;
function Clone: TMyClassBase;
end;

...

type
TMyClassBaseClass = class of TMyClassBase;

function TMyClassBase.Clone: TMyClassBase;
begin
Result := TMyClassBaseClass(ClassType).Create;
try
Result.Assign(Self);
except
Result.DisposeOf;
raise;
end;
end;


请注意, ClassType返回 TClass。我们将其强制转换为 TMyClassBaseClass以确保我们将您的基类称为虚拟构造函数。

我也看不出为什么您要对 TMyClassBase<T>进行抽象并从中派生规范。您应该能够实现泛型类中所需的一切。

关于delphi - 在我的特定类中实现Clone()的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49434769/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com