我正在尝试重构代码库,而我希望团结在一起的不相关类之间有一些共同的功能。我想在通用基类中添加该功能,但是我不确定这是否干净又好用。
假设我有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 ,可能正是您所需要的。其优点在于,可以容易地在运行时选择和选择“扩展”。