我对 MFC 一无所知。但我开始知道它有一个 CWnd
类,它包装了 win32 API 调用。并且,还有一些控件 - CListBox
以及派生自 CWnd
的控件。
Q1: CWnd
是一个接口(interface)类。 CListBox
派生自一个实现类。一般建议是避免这种情况。是 Microsoft 错了还是实现继承没有那么糟糕?
Q2:This UML描述了我们遇到的一个问题。欢迎任何关于该做什么的想法。一个建议是使用宏来“注入(inject)”通用的实现代码。我对此提出了一个问题 here .赏金今天到期。
编辑:编辑类图。
最佳答案
Q1.
没有避免实现继承的通用建议。人们总是这样做。
另一方面,MFC 是 Just Bad™ C++ 设计的首要示例。那是因为它 (1) 非常古老且不符合标准,(2) 是一个更像 C++ 的库的简化版本,称为 AFX(我记得),这对当时的程序员来说太“复杂”了。
因此,总而言之,您的 Q1 提出了一个“错误的二分法”:实现继承是好的、Microsoft 是错误的、MFC 是一个普遍糟糕的设计示例,以及 CListBox 的任何质量之间没有矛盾
有。
Q2.
换句话说,问题本质上是“使用代码生成宏为类生成通用代码是个好主意吗?”。
答案是否定的,这通常不是一个好主意。
这完全是邪恶的。虽然这种邪恶在某些情况下可能是最小的,例如提供克隆
实现,但我们正在谈论宏做一些 C++ 不支持的事情,即成员函数的一般协变实现。然而,这一点非常好,以至于大多数 SO 居民无法理解它(我知道是因为我在一个问题的答案中提出了这一点,但它被严重否决了),所以我也许不应该提出来——我只想说一般来说,嘿,这是邪恶的。
所以您知道您应该不做什么。
但是至于什么是好的替代方案,这取决于上下文。
而且您的背景描述过于模糊,无法就此提供任何真正好的建议。
干杯,
关于c++ - FE设计中的实现继承问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4447090/