Interfaces

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.

NVI (non virtual interface) pattern

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();
    }
}

Maiores detalhes

rdmd playground.d