访问派生的Singleton实例会引发编译器错误

时间:2014-06-05 04:45:25

标签: c# unity3d singleton polymorphism

我正在尝试在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();

4 个答案:

答案 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

解决方案

使MonoBehaviour成为单身人士

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()

保护Singleton不会因级别更改而被销毁

其他解决方案

你可以在这里找到它:Unity Wiki Singleton这是Imran发布的相同代码,但是他忘了在其中提供参考链接。

答案 3 :(得分:-1)

通常你会为

申请单身人士

“这是一种设计模式,它将类的实例化限制为一个对象。而且,如果您在这里,您可能希望将其用于实现全局变量。对于任何其他用法”

现在尝试implementation

其他帮助plz link