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

2 つのアプローチは表面的には似ていますが、非仮想インターフェイスのイディオムの利点は、インターフェイスが仮想メンバー関数の実装の詳細に煩わされないことです。言い換えれば、インターフェイスのさまざまな実装が仮想関数をオーバーライドすることによってその契約を満たすという事実は、インターフェイスのパブリックな側面の一部ではない実装の詳細です。特に、作成者は、ユーザーが独自の継承とオーバーライド階層を開発したことを心配することなく、関数の実装方法を将来自由に変更できます。

于 2013-08-30T23:24:56.580 に答える