簡體   English   中英

將派生類作為基類泛型類返回

[英]Returning derived class as base generic class

我在C#上編寫統一腳本。 我有我的基類:

BaseMonoBehavior<T> : MonoBehaviour where T : BasePresenter

有些腳本擴展了這個類,fe:

MyMonoBehaviour : BaseMonoBehaviour<MyPresenter> 
// MyPresenter extends BasePresenter

然后我有一個帶有方法的類型類,它根據它的值將這些腳本作為組件添加到GameObject:

void addComponentTo(GameObject gameObject) {
    if (myType == TYPE_A) {
        var script = gameObject.AddComponent<MyMonoBehaviour>();
    }
}

沒關系,但如果我想將創建的腳本作為基類返回,我該怎么辦? 我想但不能寫這樣的東西:

BaseMonoBehaviour addComponentTo(GameObject gameObject) {
    if (myType == TYPE_A) {
        var script = gameObject.AddComponent<MyMonoBehaviour>();
        return script;
    }
    return null;
}

所以,我的問題很簡單 - 我該怎么做? 我想在方法中使用一些基類方法,它調用addComponentTo ...

PS后來我想從游戲對象得到MyMonoBehaviourBaseMonoBehaviour,如果這是可能的,但它是另一個問題。

由於BaseMonoBehaviour在presenter類上是通用的,因此您也可以將AddComponentTo泛型:

BaseMonoBehaviour<TP> AddComponentTo(GameObject gameObject) where TP : BasePresenter {
    if (myType == TYPE_A) {
        var script gameObject.AddComponent<MyMonoBehaviour>();
        return script;
    }
    return null;
}

然后調用者可以按如下方式調用它:

var component = AddComponentTo<MyPresenter>(gObj);

這要求AddComponentTo返回的所有泛型實例在您可以在調用點指定的相同類型上是通用的。

注意:如果AddComponentTo在同一個演示者上創建通用的通用實例,您甚至可以將其設置為非泛型,如下所示:

BaseMonoBehaviour<MyPresenter> AddComponentTo(GameObject gameObject) {
    if (myType == TYPE_A) {
        var script gameObject.AddComponent<MyMonoBehaviour>();
        return script;
    }
    return null;
}

並稱之為:

var component = AddComponentTo(gObj);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM