繁体   English   中英

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

[英]Abstract class, use type of inheritor in generic method

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

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类。

为了“初始化”这些类的对象,我使用以下代码:

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

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

任何反馈将不胜感激。

我认为您可以使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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM