将派生类作为基类泛型类返回

时间:2017-10-10 10:53:25

标签: c# generics unity3d

我在C#上编写统一脚本。我得到了我的基础课程:

BaseMonoBehavior<T> : MonoBehaviour where T : BasePresenter

有些脚本扩展了这个类,例如:

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 ......

P.S。之后我想从 GameObject 获取 MyMonoBehaviour 作为 BaseMonoBehaviour ,如果可能的话,但是它可以还有一个问题。

1 个答案:

答案 0 :(得分:3)

由于BaseMonoBehaviour在演示者类中是通用的,因此您也可以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);