O D permite definir interfaces que são tecnicamente como os tipos class,
mas cujas funções membros devem ser implementadas
por qualquer classe que herde da interface.
interface IAnimal {
void makeNoise();
}
A função membro makeNoise deve ser implementada
por Dog porque ela herda da interface Animal.
Essencialmente, makeNoise se comporta como uma função membro abstract
em uma classe base.
class Dog : IAnimal {
void makeNoise() {
...
}
}
IAnimal animal = new Dog(); // conversão implícita a interface
animal.makeNoise();
Embora uma classe só possa herdar diretamente de uma classe base, ela pode implementar qualquer número de interfaces.
O NVI pattern
permite métodos não virtuais para uma interface comum.
Portanto, esse padrão impede a violação de um padrão de execução comum.
D ativa o padrão NVI ao
permitir funções final (ou seja, não substituíveis) em uma interface.
Isso impõe comportamentos específicos personalizados por meio da substituição de
outras funções abstratas de interface.
interface IAnimal {
void makeNoise();
final doubleNoise() // NVI pattern
{
makeNoise();
makeNoise();
}
}