Dはinterface
という、技術的にはclass
に似ていますが、
そのメンバ関数はinterface
から継承したクラスに
実装されなければならないものを定義できます。
interface Animal {
void makeNoise();
}
makeNoise
メンバ関数は、Dog
がAnimal
インターフェースを継承しているために
Dog
に実装されなければいけません。
本質的にmakeNoise
は基底クラスのabstract
メンバ関数のように振る舞います。
class Dog : Animal {
override void makeNoise() {
...
}
}
auto dog = new Dog;
Animal animal = dog; // インターフェースへの暗黙的なキャスト
animal.makeNoise();
class
が実装できるinterface
の数は無制限ですが、継承は1つの基底クラスからのみできます。
NVIパターン
は共通したインターフェースに対して 非 virtual メソッドを許可します。
それによって、このパターンは共通した実行パターンに対する違反を防ぎます。
Dではinterface
においてfinal
(つまりオーバーライド禁止)関数を定義できるようにすることでNVIパターンを実現します。
これによりinterface
における他の関数のオーバーライドによる、特殊化した振る舞いのカスタマイズが可能になります。
interface Animal {
void makeNoise();
final doubleNoise() // NVI pattern
{
makeNoise();
makeNoise();
}
}