C# - 封装



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

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

封装是通过使用访问修饰符来实现的。访问修饰符定义了类成员的作用域和可见性。C# 支持以下访问修饰符:

  • 公共 (Public)
  • 私有 (Private)
  • 受保护 (Protected)
  • 内部 (Internal)
  • 受保护的内部 (Protected internal)

公共访问修饰符

公共访问修饰符允许类将其成员变量和成员函数公开给其他函数和对象。任何公共成员都可以从类外部访问。

以下示例说明了这一点:

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的 Rectangle 类实例从 Main() 函数访问它们。

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

成员函数Display() 也被声明为public,因此也可以使用名为r的 Rectangle 类实例从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:
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的 Rectangle 类实例从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 = 4.5;
         r.width = 3.5;
         r.Display();
         Console.ReadLine();
      }
   }
}

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

Length: 4.5
Width: 3.5
Area: 15.75

在前面的示例中,请注意成员函数GetArea() 没有声明任何访问修饰符。那么,如果我们不提及任何访问修饰符,类成员的默认访问修饰符是什么?它是private

受保护的内部访问修饰符

受保护的内部访问修饰符允许类将其成员变量和成员函数隐藏于其他类对象和函数,但同一个应用程序中的子类除外。这也在实现继承时使用。

广告