Interfaces

D permet de définir des interfaces qui sont techniquement comme des types de classes, mais dont les méthodes doivent être implémentées par toute classe qui hérite de l'interface:

interface Animal
{
    void faireBruit();
}

La méthode faireBruit doit être implémentée par Chien car cette classe hérite de l'interface Animal. Basiquement, faireBruit se comporte comme une méthode abstract dans une classe parente:

class Chien: Animal
{
    override faireBruit()
    {
        //...
    }
}

auto chien = new Chien;
Animal animal = chien; // conversion implicite en type d'interface
chien.faireBruit(); 

Le pattern NVI (non virtual interface)

Le pattern NVI (Patron de conception d'interface non-virtuelle dans la langue de Molière) permet la définition d'exécutions types en autorisant la définition de méthode non virtuelles pour une interface. On peut facilement mettre en place ce pattern en D, puisque le langage autorise la définition de fonctions final dans une interface que l'on ne peut pas surcharger. Cela force un certain comportement qui est customisé par la surcharge d'autres méthodes abstraites de l'interface:

interface Animal
{
    void faireBruit();
    final doubleBruit()
    {
        faireBruit();
        faireBruit();
    }
}

Pour aller plus loin

rdmd playground.d