Csharp 简明教程

C

Encapsulation 定义为“将一个或多个项目包含在一个物理或逻辑包之中”。封装在面向对象编程方法中,阻止访问实现细节。

抽象和封装是面向对象编程中的相关特征。抽象使相关信息可见,而封装能够使程序员实现所需的抽象级别。

封装是通过使用 access specifiers 实现的。一个 access specifier 定义成员的范围和可视性。C# 支持以下访问说明符:

  1. Public

  2. Private

  3. Protected

  4. Internal

  5. Protected internal

Public Access Specifier

public 访问说明符允许一个类向其他函数和对象公开其成员变量和成员函数。任何 public 成员都可以从类外部访问。

以下示例说明此情况:

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 = 4.5;
         r.width = 3.5;
         r.Display();
         Console.ReadLine();
      }
   }
}

编译并执行上述代码后,将产生以下结果 −

Length: 4.5
Width: 3.5
Area: 15.75

在前一个示例中,成员变量 length 和 width 声明为 public ,因此它们可以使用名为 r 的矩形类的实例从函数 Main() 中进行访问。

成员函数 Display() 和 GetArea() 也能直接访问这些变量,无需使用该类的任何实例。

成员函数 Display() 也声明为 public ,因此它也能使用名为 r 的矩形类的实例从 Main() 中进行访问。

Private Access Specifier

Private 访问说明符允许某个类将其的成员变量和成员函数从其他函数和对象中隐藏起来。只有该类的函数才能访问其私有成员。即使一个类的实例也无法访问其私有成员。

以下示例说明此情况:

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:
4.4
Enter Width:
3.3
Length: 4.4
Width: 3.3
Area: 14.52

在前一个示例中,成员变量 length 和 width 被声明为 private ,因此它们无法从函数 Main() 中进行访问。成员函数 AcceptDetails() 和 Display() 能够访问这些变量。由于成员函数 AcceptDetails() 和 Display() 被声明为 public ,因此它们可以使用名为 r 的矩形类的实例从 Main() 中进行访问。

Protected Access Specifier

Protected 访问说明符允许子类访问其基类的成员变量和成员函数。以这种方式帮助实现继承。我们将在继承章节中更详细地讨论这一点。

Internal Access Specifier

Internal 访问说明符允许某个类将其的成员变量和成员函数公开给当前程序集中的其他函数和对象。换句话说,可以使用定义了成员的应用程序中定义的任何类或方法访问具有内部访问说明符的任何成员。

以下程序说明了这一点 −

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 = 4.5;
         r.width = 3.5;
         r.Display();
         Console.ReadLine();
      }
   }
}

编译并执行上述代码后,将产生以下结果 −

Length: 4.5
Width: 3.5
Area: 15.75

在前一个示例中,请注意成员函数 GetArea() 没有用任何访问说明符进行声明。那么,如果我们未提及任何访问说明符,类的成员的默认访问说明符是什么?它是 private

Protected Internal Access Specifier

Protected internal 访问说明符允许某个类将其的成员变量和成员函数从其他类对象和函数中隐藏起来,但同个应用程序中的子类除外。这在实施继承时也会使用。