Menu

Интерфейсы

D позволяет определять интерфейсы (interface), которые технически похожи на типы class, но их методы должны быть реализованы любым классом, наследующим от интерфейса.

interface Animal {
    void makeNoise();
}

Метод makeNoise должен быть реализован классом Dog, потому что он наследуется от интерфейса Animal. По сути, makeNoise работает подобно абстрактному методу основного класса.

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

auto dog = new Dog;
Animal animal = dog; // неявное преобразование к интерфейсу
animal.makeNoise();

Количество интерфейсов, которые класс может реализовать, не ограничено, но они могут наследоваться только от одного основного класса.

Шаблон NVI (невиртуальный интерфейс)

Шаблон NVI предотвращает нарушение обычного выполнения шаблона путём разрешения невиртуальных методов для обычного интерфейса. D позволяет использовать NVI шаблоны, разрешая определение в интерфейсах final функций, которые нельзя переопределять. Это обеспечивает специфические формы поведения, изменяемые переопределением других функций интерфейса.

interface Animal {
    void makeNoise();
    final doubleNoise() // шаблон NVI
    {
        makeNoise();
        makeNoise();
    }
}

Подробнее

rdmd playground.d