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在这个单位使用过.
我在这里做错了什么,我应该怎么做呢?
制作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)