D erlaubt die Definition von Interfaces (interface
),
die technisch Klassentypen (class
) entsprechen, aber deren
Member von jeder erbenden Klasse implementiert werden müssen.
interface Animal {
void makeNoise();
}
Die makeNoise
-Memberfunktion muss von Dog
implementiert
werden, weil es von dem Animal
-Interface erbt.
Letztlich verhält sich makeNoise
wie eine abstract
-Memberfunktion
einer Basisklasse.
class Dog: Animal {
override makeNoise() {
...
}
}
auto dog = new Dog;
Animal animal = dog; // implicit cast to interface
dog.makeNoise();
Die Anzahl der Interfaces einer Klasse ist nicht limitiert, es kann allerdings nur von einer Basisklasse geerbt werden.
Das NVI-Muster erlaut non virtual-Methoden in einem Interface, z.B. um den Aufruf überschriebener Methoden zu steuern.
D ermöglicht das NVI-Muster, indem es die Definition von final
-Methoden in
einem Interface erlaubt, welche nicht überschrieben werden können. Dies erzwingt
ein bestimmtes Verhalten, welche durch Überschreiben anderer Interface-
Memberfunktionen angepasst werden kann.
interface Animal {
void makeNoise();
final doubleNoise() // NVI pattern
{
makeNoise();
makeNoise();
}
}