Інтерфейси

D дозволяє визначити тип interface, який технічно подібний до class, але функції якого повинні бути обов'язково перевизначені будь-яким класом, який імплементує цей interface.

interface Animal {
    void makeNoise();
}

Функція makeNoise повинна бути перевизначена класом Dog, тому що він імплементує інтерфейс Animal. По суті makeNoise працює як abstract-на функція у базовому класі.

class Dog: Animal {
    override makeNoise() {
        ...
    }
}

auto dog = new Animal;
Animal animal = dog; // неявне приведення до типу інтерфейсу
dog.makeNoise();

Немає обмежень на кількість interface-ів, які можуть бути імплементовані у class-і, але він може наслідуватись лише від одного класу.

NVI патерн (ідіома не віртуального інтерфейсу)

NVI патерн є альтернативою загальному патерну використання інтерфейсів, який дозволяє використовувати не віртуальні методи для інтерфейсів. D дозволяє просто використовувати NVI патерн, визначивши final функції у interface, які не можуть бути перевизначені. Це забезпечує дотримання очікуваної поведінки, якщо перевизначити інші interface функції.

interface Animal {
    void makeNoise();
    final doubleNoise() // NVI патерн
    {
        makeNoise();
        makeNoise();
    }
}

Додатково

rdmd playground.d