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();
}
}