Interfaces

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.

NVI (Nonvirtual Interface) Muster

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

Weiterführende Quellen

rdmd playground.d