【问题标题】:Two times inherited from a generic class两次从泛型类继承
【发布时间】:2017-11-15 21:34:08
【问题描述】:

我有两节课

public class Singleton<T> : MonoBehaviour   where T : Component
{
    protected static T _instance;


    public static T Instance
    {
        get
        {
            return _instance;
        }
    }
}

public class GameManager : Singleton<GameManager>
{
    // Lots of Methods and Properties...
}

我想创建 3. 派生自 GameManager 的类,例如 ShooterGameManager。我可以用

创建 ShooterGameManager
public class ShooterGameManager : GameManager
{}

但 Instance 仍然是 GameManager !!!, 我尝试使用泛型类添加额外的类定义。

public class GameManager<T> : Singleton<T> where T : Component
{}

但是这次有 2 个完全不同的类可用,没有从 GameManager 继承。 我该怎么办???

【问题讨论】:

  • 什么意思但Instance仍然是GameManager
  • 创建GameManager对象时,VisualStudio中Instance类型为GameManager,但创建ShooterGameManager时Instance类型仍为GameManager。我可以像“(ShooterGameManager)Instance”一样使用,但有很多使用,有没有办法将Instance type更改为ShooterGameManager
  • 公共类 ShooterGameManager : GameManager {}
  • 代码正在运行,但我需要将实例类型更改为 ShooterGameManager 在 VisualStudio,我可以像 (ShooterGameManager)Instance 一样使用
  • 对不起,来自 Unity 项目的代码,你需要 Unity 才能运行,在我身上它工作没有任何错误,我只是不知道如何使用泛型类编写代码

标签: c# unity3d singleton instance generic-programming


【解决方案1】:

我该怎么办???

你应该彻底删除 Singleton 基类,忘记你曾经写过这样的东西。它没有任何帮助,还让你感到痛苦,那你为什么要使用它呢?

然后写:

abstract public class GameManager : MonoBehaviour
{
    protected GameManager() { whatever }
    // Lots of Methods and Properties...
}

public sealed class ShooterGameManager : GameManager
{
  private ShooterGameManager() { whatever } 
  private static ShooterGameManager instance = new ShooterGameManager();
  public static ShooterGameManager Instance { get { return instance; } }
}

完成。使基类成为单例会导致您很痛苦,并且可以避免您只输入两行代码。派生类是否为单例是该派生类的实现细节;不要强加给你的派生类作者。

【讨论】:

  • 是的,我想了一下,这种方式看起来更容易。我会用这个方法。感谢您的回答
  • 就像旁注一样,这是 Unity 和 MonoBehaviour,你不能使用那些 MonoBehaviour 来使用构造函数。这是 Unity 的限制。
【解决方案2】:

你可以像这样创建 GameManager

public GameManger<T> : Singleton<T>
{}

然后你可以创建 GameManger

public GameManager : GameManager<GameManger>
{}

和 ShooterGameManager

public ShooterGameManager : GameManager<ShooterGameManager>
{}

然后重复你需要创建的其他两种类型

下面的例子证明这是可行的

public class Program
{
    public static void Main()
    {
        new GameManager(); //Prints GameManager
        new ShooterGameManager(); //prints ShooterGameManager
    }


}

public class Singleton<T>
{
    private T _instance;

    public Singleton()
    {
        Console.WriteLine(typeof(T).Name);
    }
}

public class GameManager<T> : Singleton<T>
{
}

public class GameManager : GameManager<GameManager>
{
}

public class ShooterGameManager : GameManager<ShooterGameManager>
{
}

【讨论】:

  • 哇 =D 解决了这个问题,非常感谢@Dave,你让我免于头疼
  • 你应该看看@Eric Lippert 的回答,而不是直接解决它正在引导你走向更好的未来路线的问题
猜你喜欢
  • 2019-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-27
  • 2015-09-15
  • 1970-01-01
  • 2014-12-19
  • 1970-01-01
相关资源
最近更新 更多