I am trying to create a generic list class for use with tiOPF (an Object Persistence Framework for delphi @ http://www.tiopf.com). Specifically I am trying to take an existing generic class (TtiObjectList) and make a generic version that uses TtiObject descenants.
I have limited scope for altering the base classes as they need to compile under D7 – D2009 and Free Pascal. I need to descend from TtiObjectList to keep the existing persistence mechanisms working.
// base class type TtiObjectList = class(TtiObject) ... protected function GetItems(i: integer): TtiObject; virtual; procedure SetItems(i: integer; const AValue: TtiObject); virtual; ... public function Add(const AObject : TtiObject): integer; overload; virtual; ... end;
My class is defined as follows:
TtiGenericObjectList<T: TtiObject> = class(TtiObjectList) protected function GetItems(i:integer): T; reintroduce; procedure SetItems(i:integer; const Value: T); reintroduce; public function Add(const AObject: T): integer; reintroduce; property Items[i:integer]: T read GetItems write SetItems; default; end; implementation { TtiGenericObjectList<T> } function TtiGenericObjectList<T>.Add(const AObject: T): integer; var obj: TtiObject; begin obj:= TtiObject(AObject); /// Invalid typecast result:= inherited Add(obj); end; // alternate add, also fails function TtiGenericObjectList<T>.Add(const AObject: T): integer; begin result:= inherited Add(AObject); /// **There is no overloaded version** /// **of 'Add' that can be called with these arguments** end; function TtiGenericObjectList<T>.GetItems(i: integer): T; begin result:= T(inherited GetItems(i)); /// **Invalid typecast ** end; procedure TtiGenericObjectList<T>.SetItems(i: integer; const Value: T); begin inherited SetItems(i, Value); end;
The problem I have is that delphi is not seeing T as a TtiObject descendant. I am getting invalid typecast errors when I do something like:
function TtiGenericObjectList<T>.Add(const AObject: T): integer; var obj: TtiObject; begin obj:= TtiObject(AObject); /// **Invalid typecast*** result:= inherited Add(obj); end;
If I don’t do a type cast, then I get overload errors instead as shown in the listing above.
Any ideas where I am going wrong?
Sean
It looks like the problem is not me, but the compiler :).
In the end, I have hacked around it using the following methods
used as follows
and
I will clean these up a bit and use them till the compiler gets fixed.