C#封裝

封裝是一種被定義爲在物理或邏輯包中包含一個或多個項目的過程。封裝在面向對象的編程方法中,是用來阻止訪問具體的實現細節。

抽象和封裝是面向對象編程中的相關特徵。抽象允許相關信息可見,封裝使程序員能夠實現所需的抽象級別。

封裝通過使用訪問說明符來實現。訪問說明符定義了一個類成員的範圍和可見性 C# 支持以下訪問說明符:

  • 公共訪問說明符
  • 私有訪問說明符
  • 受保護訪問說明符
  • 內部訪問說明符
  • 保護內部訪問說明符

公共訪問說明符

公共訪問說明符允許類將成員變量和成員函數公開到其他函數和對象。任何公共會員都可以從類的外部來訪問。

以下示例說明了這一點:

using System;
namespace RectangleApplication
{
    class Rectangle
    {
        //member variables
        public double length;
        public double width;

        public double GetArea()
        {
            return length * width;
        }
        public void Display()
        {
            Console.WriteLine("Length: {0}", length);
            Console.WriteLine("Width: {0}", width);
            Console.WriteLine("Area: {0}", GetArea());
        }
    }//end class Rectangle

    class ExecuteRectangle
    {
        static void Main(string[] args)
        {
            Rectangle r = new Rectangle();
            r.length = 14.5;
            r.width = 10.5;
            r.Display();
            Console.ReadLine();
        }
    }
}

當編譯和執行上述代碼時,會產生以下結果:

Length: 14.5
Width: 10.5
Area: 152.25

在前面的例子中,成員變量:lengthwidth被聲明爲public,因此可以使用名爲rRectangle類的實例從Main()函數訪問它們。

成員函數Display()GetArea()也可以直接訪問這些變量,而不用通過該類的任何實例。

成員函數Display()也被聲明爲public,因此也可以使用名爲rRectangle類的實例從Main()訪問它。

私有訪問說明符

私有訪問說明符允許類從其他函數和對象中隱藏其成員變量和成員函數。只有同一個類的函數才能訪問其私有成員。即使是類的實例也無法訪問其私有成員。

以下示例說明了這一點:

using System;
namespace RectangleApplication 
{
   class Rectangle
   {
      //member variables
      private double length;
      private double width;

      public void Acceptdetails()
      {
         Console.WriteLine("Enter Length: ");
         length = Convert.ToDouble(Console.ReadLine());
         Console.WriteLine("Enter Width: ");
         width = Convert.ToDouble(Console.ReadLine());
      }
      public double GetArea()
      {
         return length * width;
      }
      public void Display()
      {
         Console.WriteLine("Length: {0}", length);
         Console.WriteLine("Width: {0}", width);
         Console.WriteLine("Area: {0}", GetArea());
      }
   }//end class Rectangle

   class ExecuteRectangle
   {
      static void Main(string[] args)
      {
         Rectangle r = new Rectangle();
         r.Acceptdetails();
         r.Display();
         Console.ReadLine();
      }
   }
}

當編譯和執行上述代碼時,會產生以下結果:

Enter Length:
12.5
Enter Width:
8.25
Length: 12.5
Width: 8.25
Area: 103.125

在前面的例子中,成員變量:lengthwidth被聲明爲私有的,所以不能從函數Main()訪問它們。成員函數AcceptDetails()Display()可以訪問這些變量。由於成員函數AcceptDetails()Display()被聲明爲public,因此可以使用名爲rRectangle類的實例從Main()訪問它們。

受保護訪問指定符

受保護的訪問說明符允許子類訪問其基類的成員變量和成員函數。這樣就有助於實現繼承。我們將在後續章節中詳細討論。

內部訪問指定符

內部訪問說明符允許類將其成員變量和成員函數公開到當前程序集中的其他函數和對象。換句話說,具有內部訪問說明符的任何成員都可以從定義成員的應用程序中定義的任何類或方法訪問。

以下程序說明了這一點:

using System;
namespace RectangleApplication
{
    class Rectangle
    {
        //member variables
        internal double length;
        internal double width;

        double GetArea()
        {
            return length * width;
        }
        public void Display()
        {
            Console.WriteLine("Length: {0}", length);
            Console.WriteLine("Width: {0}", width);
            Console.WriteLine("Area: {0}", GetArea());
        }
    }//end class Rectangle

    class ExecuteRectangle
    {
        static void Main(string[] args)
        {
            Rectangle r = new Rectangle();
            r.length = 12.5;
            r.width = 8.25;
            r.Display();
            Console.ReadLine();
        }
    }
}

當編譯和執行上述代碼時,會產生以下結果:

Length: 12.5
Width: 8.25
Area: 103.125

在上面的示例中,請注意,成員函數GetArea()沒有使用任何訪問說明符聲明。如果沒有使用任何一個訪問說明符的類成員,它的默認訪問說明符是什麼呢? 默認使用的是私有的。

受保護內部訪問指定符

受保護的內部訪問說明符允許類從其他類對象和函數中隱藏其成員變量和成員函數,但同一應用程序中的子類除外。這也是在實現繼承時要使用的。