抽象类,在泛型方法中使用继承者的类型

时间:2016-04-07 13:31:53

标签: c# generics inheritance unity3d

我有一个抽象类,应该由各种其他类继承,并使用GameObject方法附加到Attach,因为它做了一些初始化工作(在示例中删除)为简单起见)

public abstract class GameBehaviour : MonoBehaviour
{
    private bool initialized = false;

    public void Initialize(GameState gameState)
    {
        initialized = true;
    }

    public static T Attach<T>(GameObject parent, GameState gameState) where T : GameBehaviour
    {
        T behaviour = parent.AddComponent<T>();
        behaviour.Initialize(gameState);
        return behaviour;
    }
}

然后我有另一个名为WorldManagerWorldRenderer的类,它们都继承了抽象的GameBehaviour类。

To&#34;初始化&#34;这些类的对象我使用以下代码:

WorldManager manager = WorldManager.Attach<WorldManager>(gameObject, this);
WorldRenderer renderer = WorldRenderer.Attach<WorldRenderer>(gameObject, this);

现在,显然<WorldManager><WorldRenderer>感到多余。我的问题是,是否可以将Attach方法更改为不需要泛型类型,而是使用它的继承者类型,如果这有意义的话。可能有一些我忘记或不知道的C#概念。

非常感谢任何反馈。

1 个答案:

答案 0 :(得分:2)

我认为你可以使GameBehaviour类通用而不是方法。显然,结果是你不能使用Attach方法来附加其他类型。

通用约束使你看起来像是在圈子里,但C#打字系统允许这样就好了。

public abstract class GameBehaviour : MonoBehaviour {
    private bool initialized = false;

    public void Initialize(GameState gameState)
    {
        initialized = true;
    }
}
public abstract class GameBehaviour<T> : GameBehaviour where T: GameBehaviour<T>
{
    public static T Attach(GameObject parent, GameState gameState)
    {
        T behaviour = parent.AddComponent<T>();
        behaviour.Initialize(gameState);
        return behaviour;
    }
}

public class WorldManager: GameBehaviour<WorldManager> { ... }
public class WorldRenderer: GameBehaviour<WorldRenderer> { ... }

用法:

WorldManager manager = WorldManager.Attach(gameObject, this);
WorldRenderer renderer = WorldRenderer.Attach(gameObject, this);