<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                之前的文章中介紹的 《Unity 游戲框架搭建 (二) 單例的模板》 和 《Unity 游戲框架搭建 (三) MonoBehaviour單例的模板》有一些問題。 ## 存在的問題: * 只要繼承了單例的模板就無法再繼承其他的類。 雖然單例繼承其他類是比較臟的設計,但是難免會遇到不得不繼承的時候。沒有最好的設計,只有最合適的設計。 ## 解決方案: * 首先實現單例的類從使用方式上應該不變,還是 ```cs XXX.Instance.ABCFunc() ``` 之前的單利的模板代碼如下所示: ```cs using System; using System.Collections.Generic; using System.Text; using System.Reflection; /// <summary> /// 1.泛型 /// 2.反射 /// 3.抽象類 /// 4.命名空間 /// </summary> namespace QFramework { public abstract class QSingleton<T> where T : QSingleton<T> { protected static T mInstance = null; protected QSingleton() { } public static T Instance { get { if (mInstance == null) { // 先獲取所有非public的構造方法 ConstructorInfo[] ctors = typeof(T).GetConstructors (BindingFlags.Instance | BindingFlags.NonPublic); // 從ctors中獲取無參的構造方法 ConstructorInfo ctor = Array.Find (ctors, c => c.GetParameters ().Length == 0); if (ctor == null) throw new Exception ("Non-public ctor() not found!"); // 調用構造方法 mInstance = ctor.Invoke (null) as T; } return mInstance; } } public void Dispose() { mInstance = null; } } } ``` 按照以前的方式,如果想實現一個單例的代碼應該是這樣的: ```cs using QFramework; // 1.需要繼承QSingleton。 // 2.需要實現非public的構造方法。 public class XXXManager : QSingleton<XXXManager> { private XXXManager() { // to do ... } } public static void main(string[] args) { XXXManager.Instance().xxxyyyzzz(); } ``` 如果我想XXXManager繼承一個BaseManager代碼就變成這樣了 ```cs using QFramework; // 1.需要繼承QSingleton。 // 2.需要實現非public的構造方法。 public class XXXManager : BaseManager { private XXXManager() { // to do ... } } public static void main(string[] args) { XXXManager.Instance().xxxyyyzzz(); } ``` 這樣這個類就不是單例了,怎么辦? 答案是通過 C# 的屬性。 ```cs using QFramework; // 1.需要繼承QSingleton。 // 2.需要實現非public的構造方法。 public class XXXManager : BaseManager { private XXXManager() { // to do ... } public static XXXManager Instance { get { return QSingletonComponent<XXXManager>.Instance; } } } public static void main(string[] args) { XXXManager.Instance().xxxyyyzzz(); } ``` 好了,又看到陌生的東西了,QSingletonComponent 是什么? 和之前的單例的模板很相似,貼上代碼自己品吧... ```cs using System; using System.Collections.Generic; using System.Text; using System.Reflection; /// <summary> /// 組合方式實現單例子 /// </summary> namespace QFramework { /// <summary> /// class是引用類型 /// </summary> public class QSingletonComponent<T> where T : class { protected static T mInstance = null; public static T Instance { get { if (mInstance == null) { // 先獲取所有非public的構造方法 ConstructorInfo[] ctors = typeof(T).GetConstructors (BindingFlags.Instance | BindingFlags.NonPublic); // 從ctors中獲取無參的構造方法 ConstructorInfo ctor = Array.Find (ctors, c => c.GetParameters ().Length == 0); if (ctor == null) throw new Exception ("Non-public ctor() not found!"); // 調用構造方法 mInstance = ctor.Invoke (null) as T; } return mInstance; } } public static void Dispose() { mInstance = null; } } } ``` 這樣無法繼承的問題就解決啦。 缺點是: * 相比于 QSingleton,QSingletonComponent 在使用時候多了一次函數調用,不過做中小型項目應該可以應付了。 介紹完畢,睡覺了。。。 ## 歡迎討論! 轉載請注明地址:涼鞋的筆記:[liangxiegame.com](http://liangxiegame.com) ## 更多內容 * QFramework 地址:[https://github.com/liangxiegame/QFramework](https://github.com/liangxiegame/QFramework) * QQ 交流群:[623597263](http://shang.qq.com/wpa/qunwpa?idkey=706b8eef0fff3fe4be9ce27c8702ad7d8cc1bceabe3b7c0430ec9559b3a9ce66) * **Unity 進階小班**: * 主要訓練內容: * 框架搭建訓練(第一年) * 跟著案例學 Shader(第一年) * 副業的孵化(第二年、第三年) * 權益、授課形式等具體詳情請查看[《小班產品手冊》](https://liangxiegame.com/master/intro):https://liangxiegame.com/master/intro * 關注公眾號:liangxiegame 獲取第一時間更新通知及更多的免費內容。 ![](http://file.liangxiegame.com/38eccb55-40b2-4845-93d6-f5fb50ff9492.png)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看