Menu

Інтерфейси

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 патерн (ідіома не віртуального інтерфейсу)

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

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

Додатково

rdmd playground.d