我試圖理解為什么我無法在派生自具有系結到介面的泛型的基類的游戲物件上獲取組件。
我的班級有以下設定:
MyClass : Node<IMyInterface>
和
abstract Node<T> : Monobehaviour where T : IMyInterface
然后在與我相同的游戲物件上的單獨組件中MyClass:
GetComponent<Node<IMyInterface>>()
當我MyClass附加到同一個游戲物件時,這總是回傳 null。我也不能將組件拖到型別的公共欄位,Node<IMyInterface>即使它似乎建議我可以,因為當我將它拖到該欄位上時,它會突出顯示它,就好像我可以在那里設定它一樣。
為什么不允許這樣做?我在這里沒有看到任何錯誤,因為型別完全匹配......
uj5u.com熱心網友回復:
我注意到了介面,所以我懷疑你沒有這樣宣告MyClass,而是采用以下形式:
class MyImpl : IMyInterface;
class MyClass : Node<MyImpl>;
現在一切都說得通了。
雖然Node<MyImpl>類似于Node<IMyInterface>,但實際上是不同的型別,賦值Node<IMyInterface> node = new MyClass();無效,所以GetComponent<Node<IMyInterface>>()找不到型別為 的組件Node<MyImpl>。
在檢查器中,Node<MyImpl>和Node<IMyInterface>欄位都顯示為Node`1,這是這些類的通用型別定義(Node<>),當您將Node<MyImpl>組件拖到Node<IMyInterface>欄位中時,只會比較定義,這就是為什么您可以看到欄位高亮但無法設定的原因。
uj5u.com熱心網友回復:
MyClass : Node<IMyInterface>
abstract Node<T> : Monobehaviour where T : IMyInterface
PreciseClass : Monobehaviour , IMyInterface
GetComponent<MyClass >()//work
GetComponent<Node<PreciseClass>()//not work
GetComponent<PreciseClass>()//work
例如像這樣。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/534993.html
標籤:C#unity3d
上一篇:什么是復制和交換成語?
