在 MFC 中,提供的某些机制允许程序员绕过模块化和封装以及信息隐藏,这可以说是面向对象框架最理想的特性。
一个(众多)示例是 Owner Drawn 控件:您可以选择DrawItem
在子控件子类中实现并在该子类中完成该控件的所有绘图,使其看起来更加模块化:
class CustomButton: CButton{
// --- Lots of stuff, DECLARE_DYNAMIC etc
virtual void DrawItem(LPDRAWITEMSTRUCT lpdis){
// Drawing code for this button in the button's subclass
}
};
...或者您可以选择WM_DRAWITEM
通过 OnDrawItem 在父 Window 类中处理消息
class MainFrame: CFrameWnd{
// --- Lots of stuff, DECLARE_DYNAMIC etc
CustomButton button;
afx_msg void OnDrawItem(LPDRAWITEMSTRUCT lpdis, UINT id){
if(id == CUSTOM_BUTTON_ID){
// Drawing code for this button in the button's subclass
}
}
};
在后一种情况下,控件的绘制在控件子类之外,这意味着“OOP 数据结构倾向于随身携带自己的运算符”的概念被破坏了.. 对吗?
所以我的问题是:哪一个被认为是“最佳实践”?第二个存在一定是有原因的——任何人都可以提出破坏模块化是更好选择的情况吗?