D 编程 - 封装



所有 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 
};

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

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

使一个类成为另一个类的友元会暴露实现细节并降低封装性。理想情况下,应尽可能隐藏每个类的细节,使其不被其他任何类访问。

D 中的数据封装

任何实现具有公有和私有成员的类的 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

上述类将数字加在一起,并返回总和。公有成员addNumgetTotal 是面向外部世界的接口,用户需要知道它们才能使用该类。私有成员 total 是对外部世界隐藏的内容,但类需要它才能正常运行。

D 中的类设计策略

我们大多数人都通过痛苦的经验教训学习到,除非我们确实需要公开类成员,否则应该默认将类成员设为私有。这正是良好的封装

这种智慧最常应用于数据成员,但它同样适用于所有成员,包括虚函数。

广告