O D permite definir interface
s 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();
}
}