【发布时间】:2019-12-20 11:05:04
【问题描述】:
我在从一个泛型类继承时遇到了困难,而该泛型类本身是从一个泛型单例继承而来的。
我正在尝试创建一个作为单例的库存基类,并使用不同的派生项目从中派生不同的库存类型。
为简洁起见,代码已被简化。
public class Singleton<T> : MonoBehaviour where T : MonoBehaviour
{
private static bool m_ShuttingDown = false;
private static object m_Lock = new object();
private static T m_Instance;
public static T Instance
{
get
{
if (m_ShuttingDown)
return null;
lock (m_Lock)
{
if (m_Instance == null)
{
m_Instance = (T)FindObjectOfType(typeof(T));
if (m_Instance == null)
{
var singletonObject = new GameObject();
m_Instance = singletonObject.AddComponent<T>();
singletonObject.name = typeof(T).ToString() + " (Singleton)";
DontDestroyOnLoad(singletonObject);
}
}
return m_Instance;
}
}
}
private void OnApplicationQuit()
{
m_ShuttingDown = true;
}
private void OnDestroy()
{
m_ShuttingDown = true;
}
}
public class Inventory<T> : Singleton<Inventory<T>> where T : Item
{
...
}
public class EquipmentInventory : Inventory<Equipment>
{
...
}
public class Item : ScriptableObject
{
public string Name = "Item";
}
public class Equipment : Item
{
public string Name = "Equipment";
}
我无法访问实例;
private EquipmentInventory equipmentInventory;
private Inventory<Item> inventory;
public void Run()
{
var cachedInventory = Inventory<Item>.Instance; //returns null
var cachedEquipmentInventory = EquipmentInventory.Instance as EquipmentInventory; //returns null
}
两个语句都返回 null。
这样做的目的是,每种库存类型将是一个单件,并且每种类型的库存将实现不同的物品类型,因此基础库存将使用 Item 类型,而 Equipment 库存将使用 Equipment 实现项目类型。
这是另一种方法,似乎可以解决这个问题
public abstract class Inventory<T, TClass>
: Singleton<TClass> where TClass
: MonoBehaviour where T : Item
{
}
public class EquipmentInventory : Inventory<Equipment, EquipmentInventory>
{
}
我还没有用实际代码完全测试过这个,但是当我更彻底地测试它时会更新
请帮忙。
【问题讨论】:
-
在您提供的代码中,您从未分配给任何
m_Instance字段,因此默认情况下它们都为空。 -
在您未分配给
m_Instance的问题代码中,在您的真实代码中是否相同?如果是,那就是你的问题 -
这可能是由于我的简化,我会调查一下。单例类取自这里 wiki.unity3d.com/index.php/Singleton 我将添加完整的定义。
-
您的代码无法编译,因为没有非泛型
Inventory类,所以Inventory.Instance无效。 -
var cachedEquipmentInventory = EquipmentInventory.Instance as EquipmentInventory;始终为 null,因为该类的Instance的类型是Inventory<Equipment>而不是EquipmentInventory(无效转换导致 null)。
标签: c# unity3d generics singleton