我正在尝试重构代码库,而我希望团结在一起的不相关类之间有一些共同的功能。我想在通用基类中添加该功能,但是我不确定这是否干净又好用。

假设我有CMyWnd类和CMyDialogEx类,两者都不同,因此它们不能从一个基类继承。我想向两个类都添加一个按钮,并向两个类中都添加消息处理程序。

所以我想做这样的事情:

CMyWnd : public CWnd, public COnOkBtnFunctionality, public COnCancelBtnFunctionality
CMyDialogEx: public CWnd, public COnOkBtnFunctionality
COnOkBtnFunctionality将在其中定义CButton m_buttonOk以及它应具有的所有afx_msg函数。等等。

这种方法可行吗?还是我应该诉诸更好的模式?

最佳答案

由于COnOkBtnFunctionality的设计,您遇到了问题,它希望您仅将继承用于代码重用。

快速提醒:继承不是为代码重用而设计的,而是为引入抽象而设计的。

或者换句话说:您的CMyWnd是特定类型的COnOkBtnFunctionality还是它具有COnOkBtnFunctionality

让我将您重定向到Jeff Attwood,以获取有关该主题的更多信息:http://www.codinghorror.com/blog/2004/08/inherits-nothing.html

基本上,您想使用多个父类(super class)来实现Mixin功能。这样的实现既有优点,也有缺点。

考虑如何实现COnOkBtnFunctionality和family,以便可以将它们用作组件,而不是Window类的父类(super class)。 当然有可能,而且您可能会喜欢结果。

另外,我可以建议您考虑的一件事是 Decorator pattern ,可能正是您所需要的。其优点在于,可以容易地在运行时选择和选择“扩展”。

10-01 03:21