在我的C项目中,一个特定的纯虚拟类将表示某个概念的所有相关功能的超集,并且从该纯虚拟类派生的具体类将分别是该超集的一些不同的有限子集.运行时只存在这些具体类中的任何一个实例.
如果我使用C编程,我可能会选择将其实现为函数指针的结构,对于任何缺少的功能都使用NULL.但这对C来说并不十分令人满意.
关于我能想到的唯一一个想法是一个类,每个成员函数都是’protected’,还有一组匹配的’public’成员函数指针.构造函数将负责将MFP初始化为NULL或相应成员函数的地址,具体取决于类提供的功能.
但这实际上只比我上面提到的C-struct-of-function指针略微更多C -ish.而且,也许它足够好了.但我想知道是否有人可以为这种情况建议一个更令人满意,更有洞察力的设计模式.
我对任何普遍接受的做法持开放态度. STL很好.
更新:MFP方法不太令人满意的原因是,我将不得不为不适用的那些实现无操作的存根 – 因为纯虚基类 – 即使我会将各自的MFP设置为NULL.经过进一步思考,这次更新完全是假的. (在没有使用NULL的情况下,它们将不会是无用的存根,它们将是有用的功能.我认为我很累.)
更新2:类比:我的项目支持可以换出的硬件模块.它们基本上都是相同的功能类别,但功能和功能各不相同.在启动时,我必须检测实际连接的硬件模块,并实例化相应的类.但我不希望使用该类的代码具有每个类的特殊知识;我希望课程宣传它提供的功能. (有时,两个硬件模块将识别为相同的类型ID,但在功能探测器上,一个将指示另一个不具有的功能.)
解决方法
如果一个类或一个函数依赖于那个“超集”接口,那么编译器将永远无法强制执行类型安全 – 你基本上是在与它作斗争,为了什么?
我建议您使用segregate接口,并制作一个实现所有接口的具体(可能是纯虚拟)类.这种设计模式有一个名称 – 它叫做facade.
更新我现在阅读您的更新,我相信您需要一个促进对象的工具.
有两种促销活动:
>实施促销:
这是您基本上替换对象的实现的地方.这可以通过state模式完成,也可以通过将对象放置到具有不同VTABLE的对象来完成.
>功能促销:
这是您添加功能的地方,就像在更多功能中一样.您可以通过从硬件模块的名称到其变体指针的映射来完成此操作.将对象提升为其他类时,只需替换指针变体即可.例如,如果您的第一个映射来自“COM1” – > GenericSerial *,然后你现在设置“COM1” – > SpecializedSerial *.您可以使用变体库,例如boost’s.