封装(Encapsulation)
所有D程序都由以下两个基本要素组成 -
Program statements (code) - 这是执行操作的程序的一部分,它们被称为函数。
Program data - 受程序功能影响的程序信息。
封装是一种面向对象的编程概念,它将数据和功能绑定在一起,将数据一起操作,并保护其免受外部干扰和误用。 数据封装导致了重要的OOP data hiding概念。
Data encapsulation是捆绑数据的机制,使用它们和data abstraction是仅暴露接口并从用户隐藏实现细节的机制。
D通过创建用户定义类型(称为classes支持封装和数据隐藏的属性。 我们已经研究过一个类可以包含private ,受保护和public成员。 默认情况下,类中定义的所有项都是私有的。 例如 -
class Box {
public:
double getVolume() {
return length * breadth * height;
}
private:
double length; // Length of a box
double breadth; // Breadth of a box
double height; // Height of a box
};
变量length,widthth和height是private 。 这意味着它们只能由Box类的其他成员访问,而不能由程序的任何其他部分访问。 这是实现封装的一种方式。
要使类的某些部分成为public类(即,可以访问程序的其他部分),必须在public关键字之后声明它们。 公共说明符后定义的所有变量或函数都可由程序中的所有其他函数访问。
使一个类成为另一个类的朋友会暴露实现细节并减少封装。 保持每个类的许多细节尽可能隐藏在所有其他类中是理想的。
D中的数据封装
任何使用公共和私有成员实现类的D程序都是数据封装和数据抽象的示例。 考虑以下示例 -
例子 (Example)
import std.stdio;
class Adder {
public:
// constructor
this(int i = 0) {
total = i;
}
// interface to outside world
void addNum(int number) {
total += number;
}
// interface to outside world
int getTotal() {
return total;
};
private:
// hidden data from outside world
int total;
}
void main( ) {
Adder a = new Adder();
a.addNum(10);
a.addNum(20);
a.addNum(30);
writeln("Total ",a.getTotal());
}
编译并执行上述代码时,会产生以下结果 -
Total 60
上面的类将数字加在一起,并返回总和。 公共成员addNum和getTotal是外部世界的接口,用户需要知道它们才能使用该类。 私有成员总数是对外界隐藏的东西,但是课程需要正常运作。
D中的课堂设计策略
除非我们真的需要公开它们,否则我们大多数人都会通过痛苦的经验来学习默认情况下将类成员设为私有。 这只是很好的encapsulation 。
这种智慧最常用于数据成员,但它同样适用于所有成员,包括虚拟功能。