如何自动化覆盖方法?

时间:2015-05-03 00:29:27

标签: c++ design-patterns composite

我想知道是否有任何以相同方式覆盖所有类方法的棘手方法。例如,如何在大类中明智地实现复合模式?当我得到这样的东西时:

        class Foo{
            virtual void work() = 0;
...
        };

        class FooLeaf : public Foo{
            virtual void work() override{}
...
        };

        class FooComposite : public Foo{
            std::vector<Foo *> foos;
            virtual void work() override{
                for (auto foo : foos){
                    foo->work();
                }
            }
...
        };

重新实现一种方法不是问题。但是当方法数量增加时,代码变得非常WET。我的意思是,我觉得很好的复制粘贴foreach循环,比方说,10种方法。

1 个答案:

答案 0 :(得分:1)

如果所有方法都具有相同的签名,则可以使用方法指针:

class Foo{
  public:
    virtual void work() = 0;
    virtual void rest() = 0;
};

class FooComposite : public Foo {
  std::vector<Foo *> foos;

  void do_all(void (Foo::*method)()) {
    for (auto foo : foos) {
      (foo->*method)();
    }
  }

  void work() override {
    do_all(&Foo::work);
  }
  void rest() override {
    do_all(&Foo::rest);
  }
};