封装是一种被定义为在物理或逻辑包中包含一个或多个项目的过程。封装在面向对象的编程方法中,是用来阻止访问具体的实现细节。
抽象和封装是面向对象编程中的相关特征。抽象允许相关信息可见,封装使程序员能够实现所需的抽象级别。
封装通过使用访问说明符来实现。访问说明符定义了一个类成员的范围和可见性 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
在前面的例子中,成员变量: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:
12.5
enter width:
8.25
length: 12.5
width: 8.25
area: 103.125
在前面的例子中,成员变量:length
和width
被声明为私有的,所以不能从函数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 = 12.5;
r.width = 8.25;
r.display();
console.readline();
}
}
}
当编译和执行上述代码时,会产生以下结果:
length: 12.5
width: 8.25
area: 103.125
在上面的示例中,请注意,成员函数getarea()
没有使用任何访问说明符声明。如果没有使用任何一个访问说明符的类成员,它的默认访问说明符是什么呢? 默认使用的是私有的。
受保护的内部访问说明符允许类从其他类对象和函数中隐藏其成员变量和成员函数,但同一应用程序中的子类除外。这也是在实现继承时要使用的。