gpt4 book ai didi

Delphi泛型: How to spec "class that references its own type"

转载 作者:行者123 更新时间:2023-12-03 15:25:19 25 4
gpt4 key购买 nike

在 Delphi XE2 中,我想编写一个通用集合类来操作必须具有 Copy(owntype) 方法的对象,但我不知道如何最好地声明它。

我想要像这样的示例(为了简单起见,一个项目的集合):

//------ Library ------
Type
TBaseCopyable = class
S: string;
// procedure Copy(OtherObject: TBaseCopyable); overload;
procedure Copy(OtherObject: TBaseCopyable); virtual;
end;

MyCollection<T: TBaseCopyable, constructor> = class
TheItem: T;
procedure SetItem(AItem: T);
function GetItem: T;
end;

[...]

function MyCollection<T>.GetItem: T;
Var
NewItem: T;
begin
NewItem := T.Create;
NewItem.Copy(TheItem);
Result := NewItem;
end;


//------ Usage ------
Type
TMyCopyable = class(TBaseCopyable)
I: integer;
// procedure Copy(OtherObject: TMyCopyable); overload;
procedure Copy(OtherObject: TMyCopyable); override;
end;

[...]
Col: MyCollection<TMyCopyable>;

关键问题是在 Col 中,我需要 MyCollection 的通用实现来查找 TMyCopyable.Copy。毫不奇怪,过载或虚拟都无法完成这项工作:

  • 通过重载,代码可以编译,但 MyCollection.GetItem 发现TBaseCopyable.Copy,而不是 TMyCopyable.Copy。
  • 使用虚拟/覆盖此无法编译,因为两个 Copy 声明的签名不匹配。

所以我认为我需要在 TBaseCopyable 规范中以某种方式使用泛型,可能而不是继承。但我不确定如何实现,主要是因为我并不特别需要将类型参数提供给 TBaseCopyable,我只需要 Copy 参数类型以通用方式引用“它自己的类的类型”。

想法?谢谢!

最佳答案

TBaseCopyable转为Generic类,并将其Generic类型应用于Copy(),则TMyCopyable可以覆盖它,例如:

type
TBaseCopyable<T> = class
S: string;
procedure Copy(OtherObject: T); virtual;
end;

MyCollection<T: TBaseCopyable<T>, constructor> = class
TheItem: T;
procedure SetItem(AItem: T);
function GetItem: T;
end;

type
TMyCopyable = class(TBaseCopyable<TMyCopyable>)
I: integer;
procedure Copy(OtherObject: TMyCopyable); override;
end;

或者,只需执行 TPercient.Assign() 所做的相同操作(因为它不使用泛型):

type
TBaseCopyable = class
S: string;
procedure Copy(OtherObject: TBaseCopyable); virtual;
end;

MyCollection<T: TBaseCopyable, constructor> = class
TheItem: T;
procedure SetItem(AItem: T);
function GetItem: T;
end;

type
TMyCopyable = class(TBaseCopyable)
I: integer;
procedure Copy(OtherObject: TBaseCopyable); override;
end;

procedure TMyCopyable.Copy(OtherObject: TBaseCopyable);
begin
inherited;
if OtherObject is TMyCopyable then
I := TMyCopyable(OtherObject).I;
end;

关于Delphi泛型: How to spec "class that references its own type",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18939802/

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