如何在静态类之间共享代码

本文关键字:共享 代码 之间 静态类 | 更新日期: 2023-09-27 18:27:22

我有两个非常相似的静态类,我认为它们应该共享相同的代码库,但我在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);
    }
}

如何在静态类之间共享代码

您坚持认为这是静态的,这似乎只是在倒退旧的单例难题。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;
         }
     }
 }

至少现在,当你升级你的体系结构时,你不会留下一堆难以维护/测试的静态,甚至更糟的是,拒绝多次实例化的类。