6

抽象基本クラスがあり、派生クラスによって実装する必要がある純粋仮想メソッドが必要であるとしますが、派生メソッドが特定の順序で関数を呼び出すようにしたいのですが、それを強制するにはどうすればよいですか?

IE

base class
virtual void doABC()=0;
virtual void A()=0;
virtual void B()=0;
virtual void C()=0;


// must call ABC in the correct order 
derived class public base
void doABC();

これは、誰かが自分のクラスを正しく使用するよう強制するために自分のクラスを設計する方法をよりよく理解できるようにするためです。

4

3 に答える 3

13

テンプレート メソッド patternを探しています。

http://en.wikipedia.org/wiki/Template_method_pattern

これらの行に沿ったもの:

class BaseAlgorithm
{
protected:
    virtual void firstStep() = 0;
    virtual void secondStep() = 0;
    virtual void finalStep() = 0;
public:
    void runAlgorithm()
    {
        firstStep();
        secondStep();
        finalStep();
    }
};

class ConcreteAlgorithm : BaseAlgorithm
{
    virtual void firstStep() {};
    virtual void secondStep() {};
    virtual void finalStep() {};
};

基本的に、クラスを拡張してすべての中間ステップを実装するように強制しますが、それらを保持するprotectedか、private-これを文書化して-呼び出しのみをrunAlgorithm()行い、小さな部分を結び付けます。

于 2012-05-15T13:37:40.203 に答える
5

継承とパラメータ化のどちらを使用するかによって、実際には 2 つの特定の方法があります。

継承がある場合、それはTemplate Methodパターンです:

class Base {
public:
    void doit() {
        this->do1();
        this->do2();
    }
private:
    virtual void do1() = 0;
    virtual void do2() = 0;
};

そして、パラメータ化を行う場合、それは次のStrategyパターンです。

class Strategy {
public:
    virtual void do1() = 0;
    virtual void do2() = 0;
};

void doit(Strategy& s) {
    s.do1();
    s.do2();
}

ウェブサイトから:

戦略は、その粒度を除けばテンプレート法に似ています。[コプリエン、C++ レポート、96 年 3 月、88 ページ]

テンプレート メソッドは、継承を使用してアルゴリズムの一部を変更します。戦略は委任を使用してアルゴリズム全体を変更します。[GoF、p330]

戦略は、個々のオブジェクトのロジックを変更します。テンプレート メソッドは、クラス全体のロジックを変更します。[グランド、p383]

それらに慣れることをお勧めします。

于 2012-05-15T13:53:55.623 に答える
1

最も簡単な答えは、仮想を doABC() から削除して、子クラスから派生できないようにすることです。doABC() 内の仮想メソッドを正しい順序で呼び出します。

于 2012-05-15T13:43:29.097 に答える