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