通过继承与对象引用进行回调
Callback via inheritance vs object reference
比较以下两个变体(应该做同样的事情(
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();
}
};
什么时候首选两种变体之一?
你的第一种方法需要Bar
继承自Foo
,这与这些类紧密结合。对于回调,这并不总是您想要做的。您的第二种方法不需要这样做。
如果您实际扩展类,我会使用第一种方法,但对于通知,我会使用第二种方法,或者如 Igor R. 在注释中提到的函数指针,如对象。
我更喜欢第二个,因为它更容易通过模拟进行单元测试。但这只是我的意见。
每次继承过度是面向对象新手的常见失败。
使用委派(您称之为回调(通常更灵活。
- 类数较少
- "回调"类的可能重用
- 可在运行时而不是编译时交换
相关文章:
- 如何使用C++对象的成员函数作为 C 样式回调?
- 处理影响跨不同线程共享对象的定时回调的最佳方法是什么?
- 处理类内的回调时,必须调用对非静态成员函数的引用
- C 回调函数在对象 pascal 上崩溃
- 类 Referention 中C++回调函数引用非静态函数
- 如何成功地将函数对象(或lambda)传递给trackbar回调的第二个参数(void*)
- 如何为Python Swigged C++对象创建和分配回调函数
- 如果用户尝试从 JS 调用对象的未定义函数C++则回调C++代码
- 模板函数,用于在模板化对象上执行成员回调,而无需提供其实例
- UI自动化回调中com对象的所有权
- 回调函数,用于在同一对象中设置私有变量
- v8 回调不适用于堆上的 JavaScript 对象
- 将回调函数中对对象的引用传递给 std::thread
- COM 对象中的回调
- 如何通过引用传递成员回调函数
- 如何访问带有静态回调的对象属性
- 如何在从Objective C调用C++回调后释放桥接对象
- 使 C 样式回调对象面向
- 通过继承与对象引用进行回调
- 我如何分配静态RtMidi回调对象明智