2015-10-09 129 views
2

有一類如何用泛型方法繼承類?

TFoo = class 
    function GetValue<T>: T; 
    procedure SetValue<T>(AValue: T); 
end; 

編譯器不允許定義這一類的方法爲virtual。 怎麼樣

TChildFoo = class(TFoo) 

可能會使用祖先的方法嗎?

回答

3

正如您所觀察到的,泛型方法不能是虛擬的。這種類型的

type 
    TFoo = class 
    function Bar<T>: T; virtual; 
    end; 

被拒絕,並出現以下錯誤編譯:

E2533 Virtual, dynamic and message methods cannot have type parameters

你的類被聲明如下:

type 
    TFoo = class 
    function GetValue<T>: T; 
    procedure SetValue<T>(AValue: T); 
    end; 

你問如何子類可以使用這些方法。舉例來說,你可以這樣做:

type 
    TChildFoo = class(TFoo) 
    procedure DoSomething<T>; 
    end; 

.... 

procedure TChildFoo.DoSomething<T>; 
begin 
    SetValue(GetValue<T>); 
end; 

換句話說,你當然可以用在父類中的這些方法。你只是不能聲明它們是虛擬的並覆蓋它們。

如果您有參數化的類(而不是參數化的方法),那麼您可以聲明虛擬方法並覆蓋它們。

type 
    TFoo<T> = class 
    function Bar: T; virtual; 
    end; 

    TChildFoo<T> = class(TFoo<T>) 
    function Bar: T; override; 
    end; 

因此,這些是您的選擇。至於如何解決你的問題,這很大程度上取決於問題是什麼。

+0

我尋找問題的「通用方式」解決方案(http://stackoverflow.com/questions/32988147/is-it-possible-to-move-the-descendant-of-generic-class-to我試着研究AlexS的想法:「用一對類方法來使用類,在實現中,這些方法將委託以前的適當的專用類工作,並且dinamicaly被註冊以處理特定的數據類型」。 – user2448862

+0

我還是不太明白問題所在,所以不要有信心提出解決方案。我在你的其他問題中提供了重載方法,但即使如此,我認爲我不知道你是否知道這是否適合你的問題。 –

+0

大衛,謝謝你的幫助和時間。你當然是對的。重載方法的使用 - 最簡單有效的方法。但是,我們假設有10種方法,它應該爲10種不同的類型使用這些方法。除非不尋找通用解決方案? – user2448862