D дозволяє визначити тип interface, який технічно подібний до class,
але функції якого повинні бути обов'язково перевизначені будь-яким
класом, який імплементує цей interface.
interface Animal {
void makeNoise();
}
Функція makeNoise повинна бути перевизначена класом Dog, тому що
він імплементує інтерфейс Animal.
По суті makeNoise працює як abstract-на функція у базовому класі.
class Dog : Animal {
override makeNoise() {
...
}
}
auto dog = new Dog;
Animal animal = dog; // неявне приведення до типу інтерфейсу
animal.makeNoise();
Немає обмежень на кількість interface-ів, які можуть бути
імплементовані у class-і, але він може наслідуватись лише від
одного класу.
NVI шаблон
дозволяє використовувати не віртуальні методи для інтерфейсів.
При цьому, даний шаблон запобігає порушенню загального шаблону виконання.
D підтримує NVI шаблон шляхом позначення функцій ключовим словом final
(функції, які не можуть бути перевизначені) у interface-ах. Це забезпечує
дотримання очікуваної поведінки, якщо перевизначити інші interface
функції.
interface Animal {
void makeNoise();
final doubleNoise() // NVI патерн
{
makeNoise();
makeNoise();
}
}