封装定义为“将一个或多个项目封装在一个物理或逻辑包内的过程”。在面向对象编程方法中,封装防止访问实现细节。
抽象和封装是面向对象编程中相关的特性。抽象允许使相关信息可见,而封装使程序员能够实现所期望的抽象层次。
封装是通过使用访问修饰符来实现的。一个访问修饰符定义了一个类成员的作用域和可见性。C# 支持以下的访问修饰符:
-
-
-
-
-
Public 访问修饰符
公共访问修饰符允许一个类暴露其成员变量和成员函数给其他函数和对象。任何公共成员都可以从类外部访问。
下面的例子说明了这一点:
using System;
namespace RectangleApplication {
class Rectangle {
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());
}
}
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
被声明为公共的,因此它们可以从使用 Rectangle
类的一个实例命名的 r
的 Main()
函数中访问。
成员函数 Display()
和 GetArea()
也可以直接访问这些变量而无需使用类的任何实例。
成员函数 Display()
也被声明为公共的,所以它也可以通过 Rectangle
类的一个实例命名的 r
从 Main()
中访问。
Private 访问修饰符
私有访问修饰符允许一个类隐藏其成员变量和成员函数,不让其他函数和对象访问。只有相同类的函数可以访问其私有成员。即使是一个类的实例也不能访问它的私有成员。
下面的例子说明了这一点:
using System;
namespace RectangleApplication {
class Rectangle {
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());
}
}
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
被声明为私有的,因此它们不能从 Main()
函数中访问。成员函数 AcceptDetails()
和 Display()
可以访问这些变量。由于成员函数 AcceptDetails()
和 Display()
被声明为公共的,它们可以通过 Rectangle
类的一个实例命名的 r
从 Main()
中访问。
Protected 访问修饰符
受保护的访问修饰符允许一个子类访问其基类的成员变量和成员函数。这种方式有助于实现继承。我们将在继承章节中更详细地讨论这一点。
Internal 访问修饰符
内部访问修饰符允许一个类暴露其成员变量和成员函数给当前程序集中的其他函数和对象。换句话说,任何带有内部访问修饰符的成员都可以从定义成员的应用程序中的任何类或方法访问。
下面的程序说明了这一点:
using System;
namespace RectangleApplication {
class Rectangle {
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());
}
}
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()
没有声明任何访问修饰符。那么如果我们不提及任何访问修饰符的话,类成员的默认访问修饰符会是什么呢?它是私有的。
Protected Internal 访问修饰符
受保护的内部访问修饰符允许一个类隐藏其成员变量和成员函数,不让其他类对象和函数访问,除非是在同一个应用程序中的子类。这也用于实现继承。