Interfaces 接口

D 允许定义 interface 接口,技术上来说像是一个 class 类型,但是任何继承它的类必须实现它的成员函数。

interface IAnimal {
    void makeNoise();
}

makeNoise 成员函数必须被继承自IAnimalDog 类实现。本质上 makeNoise 就像基类里面的 abstract 抽象成员函数。

class Dog : IAnimal {
    void makeNoise() {
        ...
    }
}

IAnimal animal = new Dog(); // 隐式转换成接口
animal.makeNoise();

尽管一个类只能直接继承自一个基类,但是可以实现任意数量的接口。

NVI (non virtual interface) 非虚拟接口模式

NVI 模式 允许公共的接口是一个 non virtual 非虚函数。因此,该模式可以防止违反公共执行模式。 D 通过在接口中使用 final 函数来启用 NVI 模式。这将执行特定通过子类重写的其他抽象interface接口函数。

interface IAnimal {
    void makeNoise();
    final doubleNoise() // NVI 模式
    {
        makeNoise();
        makeNoise();
    }
}

译者注:虚函数是 C++ 中被 virtual 修饰的函数,通过虚函数表可以在基类指针或引用上调用子类方法,virtual 函数说明符,可引申为需要被子类重写的函数。这里的虚函数实际上就是指的前文的接口函数。

深入了解

rdmd playground.d