為什麼 C# 中的單例類總是密封的?


sealed 關鍵字意味著不能從該類繼承。將建構函式宣告為私有意味著無法建立類的例項。

你可以有一個帶有私有建構函式的基類,但仍然可以從該基類繼承,定義一些公有建構函式,並有效地例項化該基類。

不會繼承建構函式(因此派生類不會僅僅因為基類具有私有建構函式就擁有所有私有建構函式),並且派生類始終首先呼叫基類建構函式。

標記該類為 sealed 可以防止某人簡單地繞過你精心構建的單例類,因為它可以防止某人從該類繼承。

示例

static class Program {
   static void Main(string[] args){
      Singleton fromStudent = Singleton.GetInstance;
      fromStudent.PrintDetails("From Student");

      Singleton fromEmployee = Singleton.GetInstance;
      fromEmployee.PrintDetails("From Employee");

      Console.WriteLine("-------------------------------------");

      Singleton.DerivedSingleton derivedObj = new Singleton.DerivedSingleton();
      derivedObj.PrintDetails("From Derived");
      Console.ReadLine();
   }
}
public class Singleton {
   private static int counter = 0;
   private static object obj = new object();

   private Singleton() {
      counter++;
      Console.WriteLine("Counter Value " + counter.ToString());
   }
   private static Singleton instance = null;

   public static Singleton GetInstance{
      get {
         if (instance == null)
            instance = new Singleton();
         return instance;
      }
   }

   public void PrintDetails(string message){
      Console.WriteLine(message);
   }

   public class DerivedSingleton : Singleton {
   }
}

更新於: 2020 年 11 月 25 日

1K+ 次瀏覽

事業啟動

完成課程以獲得認證

開始
廣告
© . All rights reserved.