2

私はデザインが少し苦手なのですが、インターフェイスに単純な仮想メソッド (純粋な仮想だけでなく) を持たせるのは良いデザインなのだろうか? ある種のインターフェースであるクラスがあります:

class IModel {
    void initialize(...);
    void render(...);

    int getVertexCount() const;
    int getAnotherField() const;
};

initialize メソッドと render メソッドは確実に再実装する必要があるため、純粋な仮想メソッドの候補として適しています。ただし、最後の 2 つのメソッドは非常に単純で、実際には常に同じ実装を使用します (フィールドを返すだけです)。それらをデフォルトの実装で仮想メソッドのままにしておくことはできますか、それともインターフェイスであるため、再実装する必要がある純粋な仮想メソッドにする方がよいでしょうか?

4

3 に答える 3

2

いくつかの違いを指摘する必要があります。

「ある種のインターフェース」というものはありません。このクラスはインターフェースまたは抽象クラスであるはずですか?

それがインターフェイスであると想定されている場合、答えは次のとおりです。そのすべてのメソッドは純粋な仮想(実装​​なし) である必要があり、フィールドを 1 つも含めてはなりません。あなたができる(実際にしなければならない)のは、jaunchopanzaが言ったように、仮想デストラクタに空の本体を与えて、それに応じて派生クラスを破棄できるようにすることです。

代わりに、それが抽象クラスであると想定されている場合は、自由にフィールドを追加しm_vertexCountm_anotherField(私が推測するに) 実装getVertexCount()し、「getAnotherField()」を好きなように実装できます。ただし、プレフィックスはインターフェイスにのみ使用する必要があるため、名前を付けないでください。IModelI

編集: 私は、Bo Persson が話している「信者」の 1 人だと思います :)

于 2013-02-09T09:39:06.693 に答える
1

コードの繰り返しと可読性のトレードオフに直面しています。コードの読者は、すべての純粋なインターフェイスと、オーバーライドされていないすべてのメソッドから優れたヘルプを得ることができます。ただし、デフォルトの実装はすべてのサブクラスによって複製されます。デフォルトの実装を提供する必要があるかどうかは、デフォルトの実装が変更される可能性に依存し、その後、あらゆる場所で変更する必要があります。

これらの詳細を知らなければ、厳しいイエスまたはノーの答えを出すことはできません。

于 2013-02-09T09:41:15.023 に答える
0

できることの 1 つはIModel、インターフェイスを作成し、基本クラスを提供することです。たとえばModelBase、共通/繰り返し機能を実装します。

class IModel
{
    virtual void initialize(...) = 0;
    virtual void render(...) = 0

    virtual int getVertexCount() const = 0;
    virtual int getAnotherField() const = 0;
};

class ModelBase : public IModel
{
    // common functions
    virtual int getVertexCount() const override { return vertexCount_; }
    virtual int getAnotherField() const override { return anotherField_; }

protected:
    int vertexCount_ = 0, anotherField_ = 0;
};

class MyModel : public ModelBase
{
    virtual void initialize(...) override { ... }
    virtual void render(...) override { ... }
};

このアプローチの 1 つの欠点は、追加の仮想関数とコンパイラによる最適化の損失により、(おそらく無視できる程度の) パフォーマンスの低下が生じることです。

于 2018-08-22T02:48:22.813 に答える