2008-11-06 73 views
2

我正在檢查德爾福2009年試用版,但立即遇到了仿製藥問題。德爾福2009年泛型編譯問題

下面的代碼無法編譯,而我卻沒有絲毫的想法,爲什麼它給我的E2015的equals()方法:

type 
    TPrimaryKey<T> = class(TObject) 
    strict private 
    fValue: T; 
    public 
    constructor Create(AValue: T); 
    function Equals(Obj: TObject): boolean; override; 
    function GetValue: T; 
    end; 

constructor TPrimaryKey<T>.Create(AValue: T); 
begin 
    inherited Create; 
    fValue := AValue; 
end; 

function TPrimaryKey<T>.Equals(Obj: TObject): boolean; 
begin 
    Result := (Obj <> nil) and (Obj is TPrimaryKey<T>) 
    and (TPrimaryKey<T>(Obj).GetValue = fValue); 
end; 

function TPrimaryKey<T>.GetValue: T; 
begin 
    Result := fValue; 
end; 

爲什麼編譯器還認爲,F值和getValue的結果()不能比較?

回答

6

如果T是一個字符串?如果它是TSize記錄怎麼辦?

無約束T(例如用< T:類>),則無法確保該比較將是有意義。

相反,如果你想比較類型T的兩個值,可以使用Generics.Defaults單位及用途:

TEqualityComparer<T>.Default.Equals(x, y) 

比較值x和類型T.

3

您不能使用具有無類型泛型的運算符。有關討論,請參閱here

,如果你將其更改爲它編譯:

TPrimaryKey<T: class> = class(TObject) 
+0

由於Y的爲鏈接,以下睜開眼睛: 「泛型編譯之前,他們得到專門的 最終類型」 我認爲在C++模板方面是錯誤的,和德爾福泛型不是我的問題的解決方案。 – mghie 2008-11-07 08:18:33

+0

錯字更正:我_guess_思... – mghie 2008-11-07 08:23:45

2

我認爲原來的海報正試圖創建一個對象包裝器簡單類型(整型,雙精度等等等等),所以制約噸至類或許會不爲他想要的而工作。

+0

確實。但它看起來像德爾福2009年實施的泛型不是我希望的那樣。 – mghie 2008-11-07 08:25:09

1

編譯器在確定兩個「T」都相同時遇到了麻煩。但隨着一個小竅門,你可以讓它工作:

type 
    TPrimaryKey<T> = class(TObject) 
    public 
    type 
     TCompare<T1> = reference to function(const A1, A2: TPrimaryKey<T1>): Boolean; 
    private 
    fValue: T; 
    fCompare : TCompare<T>; 
    public 
    constructor Create(AValue: T; ACompare: TCompare<T>); 
    function Equals(Obj: TPrimaryKey<T>): Boolean; reintroduce; 
    function GetValue: T; 
    function CreateNew(const AValue: T): TPrimaryKey<T>; 

    end; 

constructor TPrimaryKey<T>.Create(AValue: T; ACompare: TCompare<T>); 
begin 
    inherited Create; 
    fValue := AValue; 
    fCompare := ACompare; 
end; 

function TPrimaryKey<T>.Equals(Obj: TPrimaryKey<T>): Boolean; 
begin 
    Result := FCompare(self, Obj); 
end; 

function TPrimaryKey<T>.GetValue: T; 
begin 
    Result := fValue; 
end; 

function TPrimaryKey<T>.CreateNew(const AValue: T): TPrimaryKey<T>; 
begin 
    Result := TPrimaryKey<T>.Create(AValue, FCompare); 
end; 

你用它實例:

var 
    p1, p2 : TPrimaryKey<Integer>; 
begin 
    p1 := TPrimaryKey<Integer>.Create(10, 
    function(const A1, A2: TPrimaryKey<Integer>): Boolean 
    begin 
     Result := (A1<>nil) and (A2<>nil) and (A1.GetValue=A2.GetValue); 
    end); 
    p2 := p1.CreateNew(10); 

    p1.Equals(p2); 
end;