Инкапсуляция


Предыдущая страница
Следующая страница  

Все программы на языке D состоят из следующих двух основополагающих элементов:

Инкапсуляция − это концепция объектно-ориентированного программирования, которая связывает вместе данные и функции, которые управляют данными, и которая защищает и то, и другое от внешних помех и неправильного использования. Инкапсуляция данных привела к важной концепции ООП − скрытию данных.

Инкапсуляция данных − это механизм объединения данных, и использующих их функций, а абстракция данных − это механизм, при котором наружу выводятся только интерфейсы, а детали реализации скрываются от пользователя.

D поддерживает свойства инкапсуляции и скрытия данных посредством создания пользовательских типов, называемых классами. Мы уже изучили, что класс может содержать закрытые (private), защищённые (protected) и открытые (public) члены. По умолчанию все элементы, определённые в классе, являются открытыми. Например:

class Box { 
   public: 
      double getVolume() { 
         return length * breadth * height; 
      } 
   private: 
      double length;      // Длина коробки 
      double breadth;     // Ширина коробки 
      double height;      // Высота коробки 
};

Переменные length, breadth и height являются закрытыми. Это означает, что к ним могут обращаться только другие члены класса 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("Всего ",a.getTotal()); 
} 

Когда вы скомпилируете и выполните эту программу, она возвратит следующий результат:

Всего 60

Вышеприведённый класс складывает числа вместе и возвращает сумму. Открытые члены addNum и getTotal являются интерфейсами для внешнего мира, и пользователь должен знать о них, чтобы использовать класс. Закрытый член total − это нечто, скрытое от внешнего мира, но необходимое для правильного функционирования класса.

Стратегия проектирования классов в D

Большинство из нас узнали через горький опыт, что члены класса нужно делать закрытыми по умолчанию, если нам действительно не нужно выводить их наружу. Это просто хорошая инкапсуляция.

Эта мудрость применяется чаще всего к данным-членам, но она одинаково применима ко всем членам, включая виртуальные функции.


Предыдущая страница
Следующая страница