0

特定の基本クラスのサブクラスプログラマーに(コンパイル時の強制なしで)何かをするように依頼することは、C ++の良い習慣と見なされますか?例えば...

このクラスの正しいサブクラスは、次のことを行う必要があります。

  • オーバーライドされた仮想関数bar()への各呼び出しの最後に保護変数m_fooを正しく入力します-上記のコメントを参照してください(このSOの質問には表示されていないいくつかのc ++コメント)

  • これらの条件が満たされている場合:[いくつかの条件]次に、オーバーライドされた仮想関数bar()の各呼び出しの最後に、この基本クラスに実装されている非仮想関数baz()を呼び出します。これは、すべてのサブクラスに共通するはずのロジックを実行するためです。

サブクラスに対するこのような命令は許容できると見なされますか、それともコンパイル時の強制ではないという事実は、コード設計に欠陥があることを示していますか?

4

4 に答える 4

1

どちらの条件も、bar()を呼び出すための基本クラスのラッパーで解決できるもののように聞こえます。例:

   class base
   {
      public:
        virtual void vbar() = 0;

      protected:
        void bar()
        {
            vbar();
            m_foo = x;
            baz();
        }


        void baz()
        {
             ... do stuff ... 
        }
      private:
        T m_foo;
    }
于 2013-02-09T21:30:09.407 に答える
1

テンプレートメソッドパターンを使用することで、この種のことを(派生クラスの作成者が何もする必要なしに)強制できます。

于 2013-02-09T21:21:38.033 に答える
0

事前条件と事後条件は、メソッドコントラクトの一部です(ソフトウェアエンジニアリングと言えば)。いいえ、実装者に特定のルールに従うように依頼することは悪い習慣ではありません。それらが明確に文書化されていることを確認してください。これらの条件のほとんどは、とにかくコンパイル時にチェックできません(実行時にチェックするのは悪いことではありませんが...)

于 2013-02-09T21:23:51.397 に答える
0

シニア、シニア開発者(私たちは彼をアーキテクトと呼ぶことができると思います)私は「あなたが言うことができるときは決して尋ねないでください」と言うのが好きです。

彼が意味すること、そして私がたまたま非常に同意することは、あなたのベースがサブクラスにあなたがすべき特定の方法で何かをさせることができるときはいつでもです。

これが出てくる場所:
1)変数が常に派生クラス(クラスの「名前」など)によって初期化される必要がある場合、それはすべてのコンストラクターの必須引数である必要があります。
2)何かの前/後に何らかのロジックを実行する必要がある場合は、仮想関数を具体的な関数でラップして、前/後を強制的に実行します。
3)同じタイプのメッセージを送信する場合、メッセージのパッキングは、クラスのインスタンスからデータを抽出する純粋仮想メソッドを使用して基本クラスで行う必要があります。

于 2013-02-09T21:42:36.380 に答える