D 语言 - 封装

所有 D 程序均由以下两个基本要素组成 −

  • 程序语句(代码) − 这是程序中执行操作的部分,它们称为函数。

  • 程序数据 − 它是受程序功能影响的程序信息。

封装是一种面向对象的编程概念,它将数据和操作数据的函数绑定在一起,并保证两者免受外部干扰和误用。 数据封装催生了重要的 OOP 概念:数据隐藏

数据封装是一种捆绑数据的机制,以及使用它们的函数和数据抽象是一种仅公开接口并向用户隐藏实现细节的机制。

D 通过创建用户定义的类型(称为)来支持封装和数据隐藏的属性。 我们已经研究过,类可以包含 private、protected 和 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 
};

变量长度、宽度和高度是私有的。 这意味着它们只能由 Box 类的其他成员访问,而不能由程序的任何其他部分访问。 这是实现封装的一种方式。

要使类的某些部分成为公共(即可供程序的其他部分访问),您必须在public关键字之后声明它们。 程序中的所有其他函数都可以访问在 public 说明符之后定义的所有变量或函数。

使一个类成为另一个类的友元会公开实现细节并减少封装。 理想的做法是尽可能多地对所有其他类隐藏每个类的详细信息。

D 中的数据封装

任何实现具有公共和私有成员的类的 D 程序都是数据封装和数据抽象的示例。 考虑下面的例子 −

示例

import std.stdio;
  
class Adder { 
   public: 
      // 构造函数 
      this(int i = 0) { 
         total = i; 
      } 
      
      // 与外界的接口
      void addNum(int number) { 
         total += number; 
      } 
      
      // 与外界的接口
      int getTotal() { 
         return total; 
      }; 
   
   private: 
      // 来自外界的隐藏数据
      int total; 
}
 
void main( ) { 
   Adder a = new Adder(); 
   
   a.addNum(10); 
   a.addNum(20); 
   a.addNum(30);  
   writeln("Total ",a.getTotal()); 
} 

当上面的代码被编译并执行时,会产生以下结果 −

Total 60

上面的类将数字相加,并返回总和。 公共成员addNumgetTotal是与外界的接口,用户需要知道它们才能使用该类。 私有成员总数是对外界隐藏的东西,但对于类的正常运行是必需的。

D 中的类设计策略

我们大多数人都通过痛苦的经历学会了默认将类成员设置为私有,除非我们确实需要公开它们。 这就是很好的封装

这种经验最常应用于数据成员,但它同样适用于所有成员,包括虚拟功能。