我想知道是否有任何以相同方式覆盖所有类方法的棘手方法。例如,如何在大类中明智地实现复合模式?当我得到这样的东西时:
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种方法。
答案 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);
}
};