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()沒有使用任何存取說明符宣告。如果沒有使用任何一個存取說明符的類成員,它的預設存取說明符是什麼呢? 預設使用的是私有的。

受保護內部存取指定符

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