我对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;


然后,将这对类进一步继承为更特定的类。我希望所有对象共享对象列表,而每个对象内部实际上都拥有不同的类型。

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;


但是,代码洞察力对此抱怨:


未声明的标识符AItemClass


更重要的是,编译器还有不同的抱怨:


未声明的标识符TObjectList


实际上,我确实在本单元中使用了System.Generics.Collections

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

最佳答案

使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/

10-13 03:17