D permet de définir des interface
s 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 (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();
}
}