4

我正在用 C++ 实现设计模式,我希望我的类通过组合来利用接口,这让我研究了实现接口的不同方法。我想澄清这个术语的定义。

4

1 回答 1

6

非虚拟接口是一个非虚拟的公共成员函数,但通常期望以可覆盖的虚拟函数的形式实现:

class Interface
{
public:
    int compute()
    {
        return compute_impl();
    }
private:
    virtual int compute_impl() = 0;
protected:
    virtual ~Interface() { }
};

这里的巧妙之处在于实现实际上是private,因为您仍然可以覆盖私有方法 - 您只是不能从外部调用它们。

相比之下,抽象接口本身是虚拟的,在接口类中也是如此:

class Interface
{
public:
    virtual int compute() = 0;
protected:
    virtual ~Interface() { }
};

虽然这两种方法看起来很相似,但非虚拟接口习惯用法的优点是接口不受虚拟成员函数的实现细节的阻碍。换句话说,接口的不同实现通过重写虚函数来满足其契约这一事实是实现的细节,而不是接口的公共方面的一部分。尤其是作者以后可以自由地改变函数的实现方式,而不必担心用户开发了自己的继承和覆盖层级。

于 2013-08-30T23:24:56.580 回答