草庐IT

C++:类功能子集的推荐设计模式?

coder 2024-02-12 原文

我正在寻求有关适合我需求的设计模式的建议:

在我的 C++ 项目中,一个特定的纯虚拟类将代表某个概念的所有相关功能的超集,并且从该纯虚拟类派生的具体类将分别是该超集的一些不同的有限子集。这些具体类中的任何一个在运行时都只会存在一个实例。

如果我用 C 语言编程,我可能会选择将其实现为函数指针结构,并使用 NULL 表示任何缺失的功能。但这对 C++ 来说并不是很令人满意。

关于我能想到的唯一想法是一个类,每个成员函数都是“ protected ”,以及一组匹配的“公共(public)”成员函数指针。构造函数将负责将 MFP 初始化为 NULL 或适当成员函数的地址,具体取决于该类提供的功能。

但这实际上只比我在上面首先提到的 C 函数指针结构稍微更像 C++。而且,也许它已经足够好了。但我想知道是否有人可以针对这种情况提出更令人满意、更有洞察力的设计模式。

我对任何普遍接受的做法持开放态度。 STL 很好。

更新:MFP 方法不是很令人满意的原因是,我将不得不为那些不适用的对象实现什么都不做的 stub ——因为纯虚拟基类——即使我将它们各自的 MFP 设置为 NULL。 进一步反射(reflection),这个更新完全是假的。 (它们不会是什么都不做的 stub ,它们将是有用的功能,在 MFP 不使用 NULL 的情况下。我想我累了。)

更新 2:打个比方:我的项目支持可以换出的硬件模块。它们基本上都是同一类别的功能,但在特性和功能上有所不同。在启动时,我必须检测实际连接了哪个硬件模块,并实例化适当的类。但是我不希望使用该类的代码对每个类都有特殊的了解;我希望类(class)宣传它提供的功能。 (有时,两个硬件模块将标识为相同的类型 ID,但在功能探测中,一个将指示另一个不指示的功能。)

最佳答案

您的设计要求违反了一个非常重要的 OOP principle . 如果一个类或函数依赖于该“超集”接口(interface),那么编译器将永远无法强制执行类型安全 - 您实际上是在与它作斗争,为了什么?

我推荐你segregate你的接口(interface),并创建一个具体的(可能是纯虚拟的)类来实现所有这些接口(interface)。这种设计模式有一个名字——叫做facade。 .

更新 我现在阅读了您的 更新,我相信您需要一种工具来推广对象。 有两种促销方式:

  • 实现促销:
    这是您实质上替换对象实现的地方。这可以通过 state 来完成模式,或通过将您的对象放置更新为具有不同 VTABLE 的对象。
  • 功能推广:
    这是您添加功能的地方,就像在更多功能中一样。您可以通过从硬件模块的名称到它的变体指针的映射来做到这一点。当您将对象提升到不同的类时,您只需替换指针变体。例如,如果您的第一个映射来自“COM1”-> GenericSerial*,那么您现在设置“COM1”->SpecializedSerial*。您可以使用变体库,例如 boost's .

关于C++:类功能子集的推荐设计模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20511733/

有关C++:类功能子集的推荐设计模式?的更多相关文章

  1. ruby-on-rails - Rails - 子类化模型的设计模式是什么? - 2

    我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co

  2. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  3. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  4. ruby - 如何在续集中重新加载表模式? - 2

    鉴于我有以下迁移:Sequel.migrationdoupdoalter_table:usersdoadd_column:is_admin,:default=>falseend#SequelrunsaDESCRIBEtablestatement,whenthemodelisloaded.#Atthispoint,itdoesnotknowthatusershaveais_adminflag.#Soitfails.@user=User.find(:email=>"admin@fancy-startup.example")@user.is_admin=true@user.save!ende

  5. ruby-on-rails - 使用 rails 4 设计而不更新用户 - 2

    我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它​​不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数

  6. ruby-on-rails - Cucumber 是否只是 rspec 的包装器以帮助将测试组织成功能? - 2

    只是想确保我理解了事情。据我目前收集到的信息,Cucumber只是一个“包装器”,或者是一种通过将事物分类为功能和步骤来组织测试的好方法,其中实际的单元测试处于步骤阶段。它允许您根据事物的工作方式组织您的测试。对吗? 最佳答案 有点。它是一种组织测试的方式,但不仅如此。它的行为就像最初的Rails集成测试一样,但更易于使用。这里最大的好处是您的session在整个Scenario中保持透明。关于Cucumber的另一件事是您(应该)从使用您的代码的浏览器或客户端的角度进行测试。如果您愿意,您可以使用步骤来构建对象和设置状态,但通常您

  7. ruby - 是否有用于序列化和反序列化各种格式的对象层次结构的模式? - 2

    给定一个复杂的对象层次结构,幸运的是它不包含循环引用,我如何实现支持各种格式的序列化?我不是来讨论实际实现的。相反,我正在寻找可能会派上用场的设计模式提示。更准确地说:我正在使用Ruby,我想解析XML和JSON数据以构建复杂的对象层次结构。此外,应该可以将该层次结构序列化为JSON、XML和可能的HTML。我可以为此使用Builder模式吗?在任何提到的情况下,我都有某种结构化数据-无论是在内存中还是文本中-我想用它来构建其他东西。我认为将序列化逻辑与实际业务逻辑分开会很好,这样我以后就可以轻松支持多种XML格式。 最佳答案 我最

  8. ruby-on-rails - Rails 中的推荐引擎 - 2

    我想为我的Rails网络应用程序提供推荐功能。特别是,我想向新注册的用户推荐他可能想要关注的其他用户。Rails中是否有用于此目的的引擎/gem?如果没有,我应该从哪里开始构建它?谢谢。 最佳答案 有Coletivogemhttps://github.com/diogenes/coletivo我试了一下。在MySQL上运行。Neo4jhttp://neo4j.org真的很容易实现一个“跟随谁”。事实上,大多数展示其能力的样本都涉及“跟随谁”。快速提示-只有在JRuby上运行时,Neo4j.rb才会很酷。如果不是-使用Neograph

  9. ruby - 使用 `+=` 和 `send` 方法 - 2

    如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:

  10. LC滤波器设计学习笔记(一)滤波电路入门 - 2

    目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称

随机推荐