Интерфейс − это способ заставить классы, которые наследуют от него, реализовать некоторые функции или переменные. Функции не должны реализовываться в интерфейсе, поскольку они всегда реализуются в классах, которые наследуются от интерфейса.
Я для себя понял (возможно, не совсем верно), что смысл интерфесов в том, чтобы сделать некое приближение к запрещённому в языке 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) методы, реализация которых должна быть включена в сам интерфейс. Конечные функции не могут быть переопределены производным классом. Ниже приведен простой пример.
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 Это статический метод Это конечный метод