如何为继承类即兴创作单例?

时间:2015-02-11 06:25:42

标签: unity3d singleton

class A
 {
     public static A Instance {get; private set;}

     protected virtual void Awake()
     {
         Instance = this;
     }
 }

 class B : A
 {
     protected override void Awake()
     {
         base.Awake();
     }

     public void Bmethod()
     {
         //do smth
     }
 }

 class C
 {
     private void SomeMethod()
     {
         B.Instance.Bmethod();
     }
 }

所以,这是一个例子。我知道这是不可能的。 我的问题是如何以类似的方式实现这一目标,而不是太久?

我提出了一个想法,但仍然认为必须有另一个,更好。

class C
 {
     private void SomeMethod()
     {
         B.Instance.gameObject.GetComponent<B>().Bmethod();
     }
 }

1 个答案:

答案 0 :(得分:1)

我总是有一个通用类来创建我的单身人士。我首先创建一个抽象类,如下所示:

using UnityEngine;

public abstract class MySingleton<T> : ClassYouWantToInheritFrom where T : MySingleton<T>
{
    static T _instance;
    public static T Instance
    {
        get
        {
            if(_instance == null) _instance = (T) FindObjectOfType(typeof(T));
            if(_instance == null) Debug.LogError("An instance of " + typeof(T) +  " is needed in the scene, but there is none.");
            return _instance;
        }
    }

    protected void Awake()
    {
        if     ( _instance == null) _instance = this as T;
        else if(_instance != this ) Destroy(this);
    }
}

现在,您将此脚本放在项目中的某个位置,而不再触摸它。

要创建一个继承ClassYouWantToInheritFrom的单例,可以使您的类继承自MySingleton&lt; MyClass&gt;而不只是ClassYouWantToInheritFrom,因为MySingleton已经继承了它。 因此:

public class MyClass : MySingleton<MyClass>
{
}

而不是

public class MyClass : ClassYouWantToInheritFrom
{
}

希望这会有所帮助:)