我正在尝试用泛型实现TCollection
和TCollectionItem
功能。要解决这个问题,我们需要对TGenericCollectionItem
或TGenericCollection
进行正向声明。实际的(XE6) Delphi 编译器不支持使用泛型类型的正向声明。There is a hack如何进行。但是我们仍然有一个问题,即为TCollectionItem
分配所有者。
TBaseElement = class // hack for forward declaration of a generic type
end;
TGenericCollection<T: TBaseElement> = class(TObjectList<TBaseElement>)
protected
procedure Notify(const Value: TBaseElement; Action: TCollectionNotification); override;
end;
TGenericCollectionItem = class(TBaseElement)
public
Owner: TGenericCollection<TBaseElement>;
end;
procedure TGenericCollection<T>.Notify(
const Value: TBaseElement; Action: TCollectionNotification);
begin
inherited;
if (Action = cnAdded) then
begin
if (Value is TGenericCollectionItem) then
(Value as TGenericCollectionItem).Owner := Self; //here is error
end;
end;
E2010不兼容的类型:'TGenericCollection<TBaseElement>'
和'TGenericCollection<TGenericCollection<T>.T>'
如何解决这一矛盾?
1条答案
按热度按时间vxf3dgd41#
您要查找的是此代码:
我不知道这段代码的原作者是谁(我不知道),但我想这段代码是不久前在Embarcadero论坛上发布的。