我剛開始學習泛型,並使用它們來重構我的代碼中相當複雜的部分(我只使用c#一段時間,但我在其他語言方面頗有經驗)。鍵入變量保存受約束泛型類的實例
我有我的類擴展基類的繼承結構。在基類中,我實現了大部分功能。但我希望能夠將這些兒童類與他們的兄弟姐妹的實例相關聯。
下面是一些相關的代碼的簡化:
class ParentClass<T>
where T : ParentClass<T>, new()
{
public static T Create()
{
return new T();
}
private object joinedItem;
public void Join<TJoinee>(TJoinee item)
where TJoinee : ParentClass<TJoinee>, new()
{
joinedItem = item;
}
}
class ChildOne : ParentClass<ChildOne>
{
}
class ChildTwo : ParentClass<ChildTwo>
{
}
有了這個代碼在地方,我可以這樣做:
var a = ChildOne.Create();
a.Join(new ChildTwo());
的問題是,我需要鍵入joinedItem
爲對象,當我真的想要鍵入它作爲ParentClass<Something>
。是否可以規定一個更具體的類型joinedItem
?或者我只是可怕地濫用語言,應該採取一種完全不同的方法?
嗯 - 我可能可以去接口路由...我會看看實際的代碼,看看是否有任何地方會掉下來... – vitch 2009-12-07 15:44:22
但即使有*沒有*在接口是獨立於T的,你說的只是爲了代碼的意圖和可讀性的清晰性。即使它只是一個標記接口,編譯器仍然會驗證你不會做不可能的強制轉換(即,你可以將一個'object'向下轉換爲'string',但是不能將'IJoinable'向下轉換爲'string' - 'string'不執行'IJoinable'。) – 2009-12-07 18:39:12
好點Eamon – philsquared 2009-12-07 21:59:18