2011-05-25 51 views
2

我想在delphi下創建一個名爲TRange的泛型類。這個想法是,它可以是一個整數範圍或一系列單個或雙等...德爾斐泛型類型 - 特異性?

TRange對象包含T類型的一些變量(maxValue,minValue,idealValue等)。 TRange包含一個函數,用於將它們轉換爲字符串。但是,由於Delphi是強類型語言,因此我需要指定「如何」將不同變量轉換爲字符串。

我可以使用GetTypeName(TypeInfo(T))獲取T類型的typeName。有一次,我知道哪些類型是T,我想我可以做這樣的事情:

if(className = 'single') then 
result := formatFloat('0.0', self.AbsMin as Single) 
else 
result := intToStr(self.AbsMin as Integer) 

然而,編譯器告訴我:「運營商並不適用於這一運算對象類型」。

所以,我想我的問題是:

有沒有辦法給特異性通用類???

+0

當然AbsMin是T型的;)。 – Alexandre 2011-05-25 14:11:20

+0

「整數」和「單個」標籤不是非常有用的恕我直言。 – jpfollenius 2011-05-25 16:38:58

回答

6

編譯器錯誤來自您不能使用as運算符轉換爲基本類型,如SingleInteger。使用一個硬演員:Single(AbsMin)

有沒有辦法給出一個泛型的特殊性?

爲什麼你需要將值轉換爲字符串?這有點違背泛型類的概念,因爲你現在已經回到了爲所有情況實現特殊行爲。

如果你真的需要這雖然你可能會引入一個接口

IValueStringConverter <T> = interface 
    function ToString(Value : T) : String; 
end; 

您只需提供轉換器在TRange類的構造函數,並將其存儲在一個領域:

constructor TRange <T>.Create(Converter : IValueStringConverter <T>); 
begin 
FConverter := Converter; 
end; 

現在只需使用班級內的轉換器來做轉換:

Str := FConverter.ToString(AbsMin);