c++ - FE设计中的实现继承问题

标签 c++ oop inheritance

我对 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/

相关文章:

c++ - 警告 C4127 : conditional expression is constant in cl command

c++ - 从2D数组中减去min

c++ - 从像素数组加载颜色值

c++ - VS2008 C++ "interface"作为参数名编译失败

c++ - 隐式转换掩盖了重载的运算符。如何解决?

Java,导入未解析,继承,内部类

c# - 如何决定一个方法是私有(private)的、 protected 、内部的还是公共(public)的?

java - 我需要关于我的抽象类是否应该是接口(interface)的建议(反之亦然)

python - 将基类添加到python中的现有对象

c# - 什么是阅读 ISomething : ISomethingElse 的正确方法