作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我对 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/
我是一名优秀的程序员,十分优秀!