两次继承自泛型类

时间:2017-11-15 21:34:09

标签: c# unity3d singleton instance generic-programming

我有两个班级

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
{}

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

2 个答案:

答案 0 :(得分:8)

  

我该怎么做???

你应该彻底删除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; } }
}

完成。使基类成为单例会使您感到痛苦并使您无需键入两行代码。派生类是否是单例是该派生类的实现细节;不要强迫你的派生类作者。

答案 1 :(得分:1)

您可以像这样创建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>
{
}