我想創建一個通用列表類與tiOPF(delphi @ www.tiopf.com的對象持久化框架)一起使用。具體來說,我正在嘗試使用現有的泛型類(TtiObjectList)並製作一個使用TtiObject降級的泛型版本。德爾菲通用約束問題
由於需要在D7 - D2009和Free Pascal下編譯,所以我修改基類的範圍有限。我需要從TtiObjectList下降以保持現有的持久性機制正常工作。
// 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;
我的類定義如下:
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;
我的問題是,德爾福沒有看到T作爲一個TtiObject後代。我收到無效的類型轉換錯誤,當我做這樣的事情:
function TtiGenericObjectList<T>.Add(const AObject: T): integer;
var obj: TtiObject;
begin
obj:= TtiObject(AObject); /// **Invalid typecast***
result:= inherited Add(obj);
end;
如果我不這樣做類型轉換,然後我得到過載的錯誤,而不是在上面的列表中顯示。
任何想法我錯了嗎?
肖恩
這是Delphi 2009編譯器中的一個錯誤;我認爲這是在Delphi 2010編譯器中解決的。 – 2009-10-27 11:05:14