【发布时间】:2013-12-11 06:05:34
【问题描述】:
我正在就一种非常适合我的需求的设计模式寻求建议:
在我的 C++ 项目中,一个特定的纯虚拟类将代表某个概念的所有相关功能的超集,而从该纯虚拟类派生的具体类将是该超集的某个不同的有限子集。这些具体类中只有一个实例在运行时存在。
如果我使用 C 编程,我可能会选择将其实现为函数指针的结构,并为任何缺失的功能使用 NULL。但这对 C++ 来说并不是很令人满意。
关于我能想到的唯一想法是一个类,其中每个成员函数都是“受保护的”,以及一组匹配的“公共”成员函数指针。构造函数将负责将 MFP 初始化为 NULL 或相应成员函数的地址,具体取决于该类提供的功能。
但这实际上只比我上面第一次提到的 C-struct-of-function-pointers 稍微多一点 C++ 风格。而且,也许它已经足够好了。但我想知道是否有人可以针对这种情况提出一种更令人满意、更有见地的设计模式。
我对任何普遍接受的做法持开放态度。 STL 没问题。
更新:MFP 方法不是很令人满意的原因是,我必须为那些不适用的存根实现无操作存根——因为纯虚拟基类——即使我将它们各自的 MFP 设置为 NULL。 进一步思考,这个更新完全是假的。 (它们不会是无所事事的存根,它们将是有用的功能,在 MFP 不使用 NULL 的情况下。我想我累了。)
更新 2:打个比方:我的项目支持可以换出的硬件模块。它们基本上都是同一类功能,但在特性和功能上有所不同。在启动时,我必须检测实际连接的硬件模块,并实例化适当的类。但是我不希望使用该类的代码对每个类都有特殊的了解;我希望班级宣传它提供的功能。 (有时,两个硬件模块将标识为相同的类型 ID,但在功能探测中,一个会指示另一个不具有的功能。)
【问题讨论】:
-
(我不确定这个问题是否适合 S.O.,但我不知道还能问哪里。)
-
这个设计很可能一开始就走错了路。但是在某些情况下,这样的事情是合适的。一种解决方案是将功能分解为纯接口,每个具体类都可以随意继承和实现。然后客户端代码可以使用例如
dynamic_cast在运行时发现有什么功能。或者在模板代码中它可以使用std::is_base_derived(我记得它的参数顺序错误,但无论如何)。但是请考虑一下这种复杂性——它就是这样——是否有有用的目的。是吗? -
我用一个类比更新了我的问题,举例说明了我觉得我需要这种方法的原因。特别是这部分:“有时,两个硬件模块将标识为相同的类型 ID,但在能力探测时,一个会指示另一个不具有的功能。”
-
对我来说,“函数指针结构”听起来很像 C++。
-
听起来像工厂创建设计模式之一可能在这里有用。
标签: c++ design-patterns member-function-pointers