1

次の 2 つのバリアントを比較します (同じことを行う必要があります)。

class Foo
    {
    public:
        void void doStuff()
            {
            //...
            doStuffImpl();
            //...
            }

        virtual void doStuffImpl()=0;
        void affectStateInFoo()
            {}
    };

class Bar:public Foo
    {
    public:
        void doStuffImpl()
            {
            affectStateInFoo();
            }
    };

class Foo;

class Callback
    {
    public:
        virtual void doStuff(Foo& foo)=0;
    };

class Foo
    {
    public:
        Foo(Callback& o):obj(o){}

        void void doStuff()
            {
            //...
            obj.doStuff(*this);
            //...
            }

        void affectStateInFoo()
            {}

        Callback& obj;
    };

class Bar:public Callback
    {
    public:
        void doStuff(Foo& foo)
            {
            foo.affectStateInFoo();
            }
    };

2 つのバリアントのうちの 1 つが優先されるのはいつですか?

4

3 に答える 3

1

最初のメソッドは、これらのクラスを密接に結合Barする から継承する必要があります。Fooコールバックの場合、これは必ずしもやりたいことではありません。2 番目の方法では、これは必要ありません。

実際にクラスを拡張する場合は最初の方法を使用しますが、通知には2番目の方法を使用するか、Igor R.がコメントで述べたようにオブジェクトのような関数ポインターを使用します。

于 2013-05-26T14:50:37.777 に答える
0

モックを使用した単体テストがより簡単なので、2 つ目の方法をお勧めします。しかし、それは私の意見です。

于 2013-05-26T14:47:40.450 に答える
0

継承ごとにやりすぎることは、オブジェクト指向の初心者にとってよくある失敗です。

委任を使用すると、コールバックと呼ばれ、一般的により柔軟になります。

  • 授業数が少ない
  • 「コールバック」クラスの再利用の可能性
  • コンパイル時ではなく実行時に交換可能
于 2013-05-26T14:50:38.847 に答える