Интерфейсы


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

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

Я для себя понял (возможно, не совсем верно), что смысл интерфесов в том, чтобы сделать некое приближение к запрещённому в языке D множественному наследованию (тоже самое есть в языке Java). Реализацию унаследовать не получится, а вот поведение – вполне. И полиморфизм с интерфейсами тоже действует. – прим. пер.

Интерфейс создается с использованием ключевого слова interface, вместо слова class, хотя они похожи во многих отношениях. Когда вы хотите унаследовать класс от интерфейса, и при этом класс уже наследуется от другого класса, вам нужно отделить имя класса от имени интерфейса запятой.

Давайте рассмотрим простой пример, в котором показано использование интерфейса.

Пример

import std.stdio;

// Базовый интерфейс 
interface Shape {
   public: 
      void setWidth(int w);
      void setHeight(int h);
}

// Унаследованный класс 
class Rectangle: Shape {
   int width;
   int height;
   
   public:
      void setWidth(int w) {
         width = w;
      }
      void setHeight(int h) {
         height = h; 
      }
      int getArea() {
         return (width * height);
      }
}

void main() {
   Rectangle Rect = new Rectangle();
   Rect.setWidth(5);
   Rect.setHeight(7);

   // Вывод площади объекта.
   writeln("Общая площадь: ", Rect.getArea());
}

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

Общая площадь: 35

Интерфейс с функциями final и static

Интерфейс может содержать конечные (с ключевым словом final) и статические (со словом static) методы, реализация которых должна быть включена в сам интерфейс. Конечные функции не могут быть переопределены производным классом. Ниже приведен простой пример.

Пример

import std.stdio;

// Базовый интерфейс
interface Shape {
   public:
      void setWidth(int w);
      void setHeight(int h);
      
      static void myfunction1() {
         writeln("Это статический метод");
      }
      final void myfunction2() {
         writeln("Это конечный метод");
      }
}

// Унаследованный класс
class Rectangle: Shape {
   int width;
   int height; 
   
   public:
      void setWidth(int w) {
         width = w;
      }
      void setHeight(int h) {
         height = h;
      }
      int getArea() {
         return (width * height);
      }
}

void main() {
   Rectangle rect = new Rectangle();

   rect.setWidth(5);
   rect.setHeight(7);
   
   // Вывод площади объекта.
   writeln("Общая площадь: ", rect.getArea());
   rect.myfunction1();
   rect.myfunction2();
} 

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

Общая площадь: 35
Это статический метод
Это конечный метод

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