2016-03-15 82 views
0

我想能夠聲明泛型類與3級繼承 我無法獲得通用類型從繼承樹的頂部通過泛型。傳遞泛型類型向下類繼承

所以在這個例子動物類型是狗。 這將如何實現?

public class Animal<T> : MonoBehaviour where T : MonoBehaviour 
{  
} 

public class Quadruped<T> : Animal<T> where T 
{ 
} 

public class Dog : Quadruped<Dog> 
{ 
} 

目前我不確定如何操作,這不是有效的

類型「T」不能用作泛型類型或方法「動物」類型參數「T」。沒有從'T'到'UnityEngine.MonoBehaviour'的裝箱轉換或類型參數轉換。 [大會-CSHARP]

+0

那麼首先你需要對你的泛型類型爲'Quadruped'相同(或更嚴格的)約束有'動物'。然後,你需要'Dog'是一個'MonoBehaviour'這將是不可能的,除非它是一個接口。 – juharr

+0

'Dog'可以從'Animal'直接繼承,一切都很好,但我想介紹'Quadruped'插圖中。 – Rob

+0

我只是想知道,通用的優點是什麼?你爲什麼不直接推斷這個鏈條?謝謝 – Fattie

回答

4

這應該工作...

public class Animal<T> : MonoBehaviour where T : MonoBehaviour 
{  
} 

public class Quadruped<T> : Animal<T> where T : MonoBehaviour 
{ 
} 

public class Dog : Quadruped<Dog> 
{ 
} 
+0

嗨,謝謝,但是'Dog'中出現以下錯誤:'類型'Quadruped '與導入類型'Quadruped '衝突''Quadruped'也給出以下錯誤:'類型或名稱空間名稱「動物」找不到(是否缺少using指令或程序集引用?)' – Rob

+0

你是第一,清洗後它完美的作品。謝謝! – Rob

1

問題是這樣的類:

public class Quadruped<T> : Animal<T> 
{ 

} 

Animal<T>需求T是一個MonoBehaviour,但類Quadruped<T>不施加任何約束T,使盡可能Quadruped<T>而言,T可以任何類型,它是無效的,BEC澳洲英語Animal<T>明確需要一個MonoBehaviour

您可以通過應用相同的約束解決這Quadruped<T>

public class Quadruped<T> : Animal<T> where T : MonoBehaviour 
{ 

} 
+0

這給在'Dog'以下錯誤:'類型「四足」與進口型「四足」衝突'也給出了'Quadruped'以下錯誤:'類型或命名空間名稱‘動物’可能找不到(是否缺少using指令或程序集引用?)' – Rob

+1

@Rob嘗試清洗和重建。 –

+0

Doh,謝謝。工作正常。 – Rob