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
предотвращает нарушение обычного выполнения шаблона путём разрешения
невиртуальных методов для обычного интерфейса.
D позволяет использовать NVI шаблоны, разрешая определение в интерфейсах final
функций, которые нельзя переопределять. Это обеспечивает специфические формы поведения, изменяемые переопределением других функций интерфейса.
interface Animal {
void makeNoise();
final doubleNoise() // шаблон NVI
{
makeNoise();
makeNoise();
}
}