在 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。
- 使用 virtual/override 这不会编译,因为两个 Copy 声明的签名不匹配。
所以我想我需要在 TBaseCopyable 的规范中以某种方式使用泛型,可能而不是继承。但我不确定如何,主要是因为我并不特别需要将类型参数提供给 TBaseCopyable,我只需要 Copy 参数类型以通用方式引用“它自己的类的类型”。
想法?谢谢!