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

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

Length: 4.5
Width: 3.5
Area: 15.75

在前面的示例中,成员变量length和width声明为 public ,因此可以使用名为的Rectangle类的实例从函数Main()访问它们. r .

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

成员函数 Display()也被声明为 public ,所以它也可以从

私有访问说明符

私有访问说明符允许类从其他函数和对象隐藏其成员变量和成员函数.只有同一个类的函数才能访问其私有成员.即使是一个类的实例也无法访问其私有成员.

以下示例说明了这个 :

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 ,因此可以从 Main()使用Rectangle类的实例,名为 r .

受保护的访问说明符

受保护的访问说明符允许孩子用于访问其基类的成员变量和成员函数的类.这样它有助于实现继承.我们将在继承章节中详细讨论这一点.

内部访问说明符

内部访问说明符允许类公开其成员变量和成员功能到当前程序集中的其他功能和对象.换句话说,任何具有内部访问说明符的成员都可以从定义成员的应用程序中定义的任何类或方法中访问.

以下程序说明了这个 :

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()未使用任何访问说明符声明.那么如果我们不提及任何类成员的默认访问说明符,那么它是什么?它是私有.

受保护的内部访问说明符

受保护的内部访问说明符允许类隐藏其成员变量和其他类对象和函数的成员函数,但同一应用程序中的子类除外.在实现继承时也会使用它.