2015-12-18 37 views
-2

我有兩個非常相似的靜態類,我相信應該共享相同的代碼庫,但我一直運行在c#中的限制。如何在靜態類之間共享代碼?

接口不能聲明靜態方法,靜態方法不能是虛擬等

最後,我只想下面的一個更好看的版本:

public class StaticCoroutine { 
    private static MonoBehaviour runner; 

    public static void Start(IEnumerator coroutine) { 
     if (runner == null) { 
      runner = new GameObject("[Static Coroutine Runner]").AddComponent<StaticCoroutineRunner>(); 
     } 
     runner.StartCoroutine(coroutine); 
    } 

    public static void Stop(IEnumerator coroutine) { 
     if (runner != null) runner.StopCoroutine(coroutine); 
    } 
} 

public class StaticCoroutineInfinite { 
    private static MonoBehaviour runner; 

    public static void Start(IEnumerator coroutine) { 
     if (runner == null) { 
      runner = new GameObject("[Static Coroutine Infinite Runner]").AddComponent<StaticCoroutineRunner>(); 
      Object.DontDestroyOnLoad(runner.GameObject); 
     } 
     runner.StartCoroutine(coroutine); 
    } 

    public static void Stop(IEnumerator coroutine) { 
     if (runner != null) runner.StopCoroutine(coroutine); 
    } 
} 
+2

適合[codereview](http://codereview.stackexchange.com/)更好。 – Sinatr

+1

也許你應該在http://codereview.stackexchange.com/上發佈這個。 –

+1

爲什麼你必須使用'static'類? – Aron

回答

1

它看起來像你只是通過堅持認爲這仍然是靜態的,來重新解決舊的單身難題。 static是模塊化的敵人。

我真的建議不要這樣......即使你不使用IoC/DI,你也應該把服務作爲可注入的依賴來提供。

假設您現在不願意完全重構,我建議將所有功能移入實例類,併爲該類的實例提供一個靜態訪問器。

public class MyThing : SomeBaseClass, ICanImplementInterfaces 
{ 
    private Lazy<MyThing> myThingLazy = new Lazy<MyThing>(() => new MyThing()) 
    public static MyThing Instance 
    { 
     get 
     { 
      return myThingLazy.Value; 
     } 
    } 
} 

至少現在,當你升級你的建築,你會不會留下一堆難以維護/測試靜,甚至更糟,那些拒絕實例化不止一次類。

+0

恩,謝謝你的努力。我不得不問,以便我可以說服自己,我沒有忽略一些更簡單的解決方案。如果沒有重寫,這個班不太可能改變......這次的差別是我想學點東西。 – Steinbitglis