所有的D程序有以下两个基本要素:
-
程序语句(代码): 这是一个程序,它执行动作被称为函数的一部分。
-
程序数据:该数据是受程式功能的程序的信息。
封装是操作数据的数据和功能结合在一起的面向对象编程的概念,并保持既安全不受外界干扰和误用。数据封装导致数据隐藏重要的OOP概念。
数据封装是捆绑的数据的机制,以及使用它们和数据抽象的功能是仅暴露的接口和隐藏来自用户的执行细节的机制。
D支持封装和数据通过创建用户定义的类型,称为类隐藏的属性。我们已经研究了一类可以包含私有的,受保护的和公共的成员。默认情况下,在一个类中定义的所有项目都是私有的。例如:
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 };
变量长度,宽度和高度都是私有的。这意味着,他们只能通过Box类的其他成员进行访问,而不是由你的程序的任何其他部分。这是封装的实现方式之一。
为了使一个类公开(即,访问程序的其他部分)的部分,则必须在public关键字后声明。所有定义的变量或函数是由程序中的所有其他函数访问。
使一个类的另一个好友暴露的实施细则,并降低了封装。理想的是保持尽可能多的各类别隐藏所有其他类尽可能的详细信息。
数据封装示例:
实现一个类的公共和私有成员的任何D程序是数据封装和数据抽象的例子。请看下面的例子:
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是外面的世界的接口,一个用户需要知道他们使用的类。私有成员total 是从外界隐藏的,但需要为类正常运作。
设计策略:
我们大多数人都通过痛苦经历教训,默认情况下类成员是私有的,除非我们真的要揭露他们。这只是良好的封装。
这种智慧是最常应用于数据成员,但它同样适用于所有成员,包括虚函数。