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

Jer*_*dge 1 delphi generics inheritance delphi-10.1-berlin

我对Delphi中的泛型仍然有些模糊,但已经广泛使用TObjectList<>.现在我有一种情况,我有一个具有这样一个私有字段的基类,但需要为任意类创建,也从另一个基类继承.

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

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;
Run Code Online (Sandbox Code Playgroud)

然后,这对类进一步继承到更具体的类中.我想要为所有这些对象列表共享对象列表,而每个对象列表在内部实际上保持不同的类型.

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

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

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

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

但是,代码洞察力抱怨这个:

未声明的标识符 AItemClass

更进一步,编译器还有一个不同的抱怨:

未声明的标识符 TObjectList

在哪里,我确实System.Generics.Collections在这个单位使用过.

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

Ste*_*nke 6

制作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;
Run Code Online (Sandbox Code Playgroud)

如果继承,只需输入正确的泛型参数:

TSomeItems = class(TItems<TSomeItem>)
public
  procedure DoSomethingOnlyThisClassShouldDo;
  ...
end;
Run Code Online (Sandbox Code Playgroud)