gpt4 book ai didi

delphi - 如何将 TObjectList 用于任意类类型?

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

我对 Delphi 中的泛型仍然有点模糊,但一直在使用 TObjectList<>相当广泛。现在我遇到的情况是,我有一个具有此类私有(private)字段的基类,但需要为任意类创建,并且该类也是从另一个基类继承的。

为了澄清,我有两个基类:

type
TItem = class;
TItems = class;

TItemClass = class of TItem;

TItem = class(TPersistent)
private
FSomeStuffForAllIneritedClasses: TSomeStuff;
end;

TItems = class(TPersistent)
private
FItems: TObjectList<TItem>;
FItemClass: TItemClass;
public
constructor Create(AItemClass: TItemClass);
destructor Destroy; override;
function Add: TItem;
...
end;

这对类随后被进一步继承为更具体的类。我希望所有对象共享对象列表,而每个对象实际上在内部保存不同的类型。

type
TSomeItem = class(TItem)
private
FSomeOtherStuff: TSomeOtherStuff;
...
end;

TSomeItems = class(TItems)
public
function Add: TSomeItem; //Calls inherited, similar to a TCollection
procedure DoSomethingOnlyThisClassShouldDo;
...
end;

现在的问题是创建实际的对象列表。我正在尝试这样做:

constructor TItems.Create(AItemClass: TItemClass);
begin
inherited Create;
FItemClass:= AItemClass;
FItems:= TObjectList<AItemClass>.Create(True);
end;

但是,代码洞察对此有所提示:

Undeclared Identifier AItemClass

更重要的是,编译器还有一个不同的提示:

Undeclared Identifier TObjectList

在哪里,我实际上有 System.Generics.Collections native 使用。

我在这里做错了什么,我应该怎么做?

最佳答案

使TItems通用:

TItems<T: TItem, constructor> = class(TPersistent)
private
FItems: TObjectList<T>;
public
constructor Create;
destructor Destroy; override;
function Add: T;
...
end;

constructor TItems.Create;
begin
inherited Create;
FItems:= TObjectList<T>.Create(True);
end;

function TItems<T>.Add: T;
begin
Result := T.Create;
FItems.Add(Result);
end;

如果继承,只需输入正确的通用参数即可:

TSomeItems = class(TItems<TSomeItem>)
public
procedure DoSomethingOnlyThisClassShouldDo;
...
end;

关于delphi - 如何将 TObjectList 用于任意类类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48210633/

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