我正在尝试在Unity3d项目中实现Singleton基类。但是,尝试访问Singleton的实例会引发编译器错误:
Type 'Singleton' does not contain a definition for 'getPlaneTextureType' and no extension method 'getPlaneTextureType' of type 'Singleton' could be found (are you missing a using directive or an assembly reference?)
我是否需要为从Singleton派生的每个类重写方法/属性instance
?即,将返回类型更改为子类类型?或者我可以对基类Singleton
进行一次简单的更改,以解决这个问题?比如说;使用类似c ++的模板?
public class Singleton : MonoBehaviour {
#region Static Variables
private static Singleton _instance = null;
#endregion
#region Singleton Class Generation
public static Singleton instance {
get { return _instance; }
}
protected Singleton() { }
void Awake() {
if (_instance != null) {
GameObject.Destroy( this );
return;
}
_instance = this;
}
#endregion
}
public class TerrainManager : Singleton {
public PlaneTexture getPlaneTextureType() { }
}
// Usage that throws compiler error: Type 'Singleton' does not contain a definition for 'getPlaneTextureType' and no extension method 'getPlaneTextureType' of type 'Singleton' could be found (are you missing a using directive or an assembly reference?)
TerrainManager.instance.getPlaneTextureType();
答案 0 :(得分:0)
您可以将getPlaneTextureType()
方法转移到Singleton
的{{1}}类,以便将TerrainManager.instance.getPlaneTextureType()
更改为静态方法并将其称为... { {1}}。
答案 1 :(得分:0)
继承不会帮助您在C#中实现单例。原因是如果将静态字段放在基类中,则它对于所有继承的类都是相同的静态字段。这正是你不想要的。您希望每个继承的类中的静态字段和/或属性不同。
首先实现一个代码的代码并不多,所以继承并不能让你重用很多代码。这是您的基本单例模板:
public class Singleton
{
private static readonly Singleton instance = new Singleton();
private Singleton() { }
public static Singleton Instance { get { return instance; } }
}
我会在每次需要时复制并粘贴它,但我发现自己只是谨慎地使用单例模式。
答案 2 :(得分:0)
有时你希望Unity中的Singleton只是一个普通的Singleton Design模式而不是MonoBehaviour。
Othertimes你需要你的Singleton成为MonoBehaviour。当它必须是MonoBehaviour时,您可以这样做,以避免在MonoBehaviours上调用new
。
public class Singleton : MonoBehaviour
{
private static Singleton _instance;
// Will be called before anything, don't even worry about it, instance be initialized.
void Awake()
{
_instance = this;
}
public static Singleton getInstance()
{
return _instance;
}
}
这也应该允许你继承这个Singleton:
public class Singleton2 : Singleton
{
}
此外,您正在使用的Destroy()
代码不会是一个好主意,除非您使用DontDestroyOnLoad()
你可以在这里找到它:Unity Wiki Singleton这是Imran发布的相同代码,但是他忘了在其中提供参考链接。
答案 3 :(得分:-1)
通常你会为
申请单身人士“这是一种设计模式,它将类的实例化限制为一个对象。而且,如果您在这里,您可能希望将其用于实现全局变量。对于任何其他用法”强>
现在尝试implementation
其他帮助plz link