基於較早的post,我寫了下面的代碼。請原諒這篇文章的冗長。我相信各方都可以提供完整的代碼進行測試和評論。德爾福:泛型和「is」操作符問題
program sandbox;
{$APPTYPE CONSOLE}
uses
SysUtils,
Generics.Collections;
type
TDataType = class
// Stuff common to TInt and TStr
end;
TInt = class(TDataType)
FValue: integer;
constructor Create(Value, Low, High: integer);
end;
TStr = class(TDataType)
FValue: string;
constructor Create(Value: string; Length: integer);
end;
TSomeClass = class
FIntList: TList<TInt>;
FStrList: TList<TStr>;
procedure AddToList<T: TDataType>(Element: T);
constructor Create();
procedure Free();
end;
constructor TInt.Create(Value, Low, High: Integer);
begin
inherited Create();
FValue := Value;
end;
constructor TStr.Create(Value: string; Length: Integer);
begin
inherited Create();
FValue := Value;
end;
procedure TSomeClass.AddToList<T>(Element: T);
begin
if TObject(Element) is TInt then
FIntList.Add(Element)
else if TObject(Element) is TStr then
FStrList.Add(Element);
end;
constructor TSomeClass.Create();
begin
inherited;
FIntList := TList<TInt>.Create();
FStrList := TList<TStr>.Create();
end;
procedure TSomeClass.Free();
var
SomeIntItem: TInt;
SomeStrItem: TStr;
begin
for SomeIntItem in FIntList do begin
SomeIntItem.Free();
end;
for SomeStrItem in FStrList do begin
SomeStrItem.Free;
end;
FIntList.Free();
FStrList.Free();
end;
var
Inst: TSomeClass;
begin
try
{ TODO -oUser -cConsole Main : Insert code here }
Inst := TSomeClass.Create;
Inst.AddToList(TInt.Create(100, 0, 101));
Inst.AddToList(TStr.Create('Test', 10));
Inst.Free;
except
on E:Exception do
Writeln(E.Classname, ': ', E.Message);
end;
end.
注意的TInt
和TStr
在現實世界中的構造函數可以利用Low, High: integer
和Length: integer
參數以及。我在運行Delphi 2009的if TObject(Element) is TInt then
和else if TObject(Element) is TStr then
上有一個「E2089無效的類型轉換」。有誰知道爲什麼會發生這種情況?
編輯:請注意,TInt
和TStr
只是兩個可能10-20其他類型;否則超載是該工作的工具。 :)
你的聲明和實現AddToList的不同。我對泛型沒有足夠的瞭解,但對於普通的帕斯卡來說,這是錯誤的。 – 2009-11-19 07:48:14
嗨列文!我認爲你指的是與簽名「procedure AddToList(Element:T)」相比,實現「procedure TSomeClass.AddToList (Element:T)」?如果是這樣,對你的評論的迴應是RAD工作室不希望對實際實施產生限制。 –
conciliator
2009-11-19 08:26:07
啊,我明白了。對於那些尚未納入仿製藥領域的人來說,至少最明顯的是現在已經不存在了。感謝您清理它。 – 2009-11-19 08:28:52