我有一個抽象類,GenericModel
,它定義了一個模板的方法如下:在模板方法的覆蓋訪問中間類屬性
public virtual string DoStuff<TType>(IEnumerable<TType> input)
where TType : GenericModel { return null; }
我然後具有表示特定一類從GenericModel
繼承調用BasicModel
GenericModel
的子集有足夠的共同性來保證另一種結構。雖然這是一個具體的類,它從來沒有實際實例化,而是其他類從它繼承,因爲有一些共同的屬性不一定在每個GenericModel
,但在每個BasicModel
(例如我們的目的說每BasicModel
有一個id
財產)。
如果我有一個從BasicModel
稱爲ChildModel
繼承的類,我想重寫DoStuff()
,這是允許的,因爲從BasicModel
從GenericModel
繼承ChildModel
繼承。所以我定義的覆蓋方法(在ChildModel
)如下:
public override string DoStuff<ChildModel>(IEnumerable<ChildModel> input){
foreach(var data in input){
var foo = data.id;
//Do stuff with foo
}
//Do more stuff
}
的問題是,Visual Studio中突出data.id
作爲一個錯誤,說data
沒有一個名爲id
屬性。我的假設是,這是由於模板方法的where TType : GenericModel
部分;它會忽略中間的BasicModel
,因此我無法訪問BasicModel
中定義的屬性。
這似乎很奇怪,我因爲我指出,輸入必須包括ChildModel
S的將全部由定義的BasicModel
子類,有一個id
財產。
有沒有辦法在ChildModel
的覆蓋DoStuff()
中訪問這些中間類屬性,或者這對我設置繼承的方式是不可能的?是否有任何解決辦法或更改可以讓我們使用這些屬性?
編輯:從評論和答案看,我對模板方法有一個基本的誤解。我真正想要做的是在GenericModel
中定義一個通用方法,輸入IEnumerable<GenericModel>
,然後在每個子類中被覆蓋,其中覆蓋代替使用IEnumerable<ChildClass>
。顯然這個目標可能不適用於我所定義的結構。
在'DoStuff','ChildModel'是一個類型參數,而不是一個具體的類的引用。你的方法有效地試圖用'DoStuff(...)'覆蓋'DoStuff'。你不能用這種方式專門化泛型方法。 –
Lee
@Lee不是type參數用我寫的方式來定義輸入參數的類型嗎?我認爲type參數僅僅是爲了讓輸入參數使用許多不同的類型,每個最低級別的類別都有一個類型參數,其中每個實例可以使用這些類別的所有屬性。 –
@ChrisH。不,不是的。你只是給泛型參數一個不同的名字。不管你稱之爲通用參數,名稱絕不會改變它的功能。 – Servy