2
有一類如何用泛型方法繼承類?
TFoo = class
function GetValue<T>: T;
procedure SetValue<T>(AValue: T);
end;
編譯器不允許定義這一類的方法爲virtual
。 怎麼樣
TChildFoo = class(TFoo)
可能會使用祖先的方法嗎?
有一類如何用泛型方法繼承類?
TFoo = class
function GetValue<T>: T;
procedure SetValue<T>(AValue: T);
end;
編譯器不允許定義這一類的方法爲virtual
。 怎麼樣
TChildFoo = class(TFoo)
可能會使用祖先的方法嗎?
正如您所觀察到的,泛型方法不能是虛擬的。這種類型的
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;
因此,這些是您的選擇。至於如何解決你的問題,這很大程度上取決於問題是什麼。
我尋找問題的「通用方式」解決方案(http://stackoverflow.com/questions/32988147/is-it-possible-to-move-the-descendant-of-generic-class-to我試着研究AlexS的想法:「用一對類方法來使用類,在實現中,這些方法將委託以前的適當的專用類工作,並且dinamicaly被註冊以處理特定的數據類型」。 – user2448862
我還是不太明白問題所在,所以不要有信心提出解決方案。我在你的其他問題中提供了重載方法,但即使如此,我認爲我不知道你是否知道這是否適合你的問題。 –
大衛,謝謝你的幫助和時間。你當然是對的。重載方法的使用 - 最簡單有效的方法。但是,我們假設有10種方法,它應該爲10種不同的類型使用這些方法。除非不尋找通用解決方案? – user2448862