- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一个架构,其中几乎所有内容都是一个插件。该体系结构是图形用户界面的基础,其中每个插件都由“表面”(即用户可以通过其与插件进行交互的UI控件)表示。这些表面也是插件。每当添加新插件时,瘦主机都会自动确定哪个可用表面最适合它。这个问题的主题是如何在C++中实现动态类型匹配。
如您所见,目前,该体系结构是使用C#实现的,很大程度上依赖于反射。但是,我现在正在为C++重新设计整个过程,但是由于C++没有反射(并且由于我是C++的新手),我需要一些有关如何最好地复制没有此功能的信息。
这是目前在C#(简化和伪)中的处理方式:
所有插件都是Plugin
类的后代。
每种表面类型均带有“目标插件类型”标记,指示其设计用于的最具体/最深的后代。
最通用的表面是仅处理插件级别的表面(例如,仅显示名称标签)。这样可以确保所有插件至少具有一个可以在屏幕上表示它们的表面,即使它没有提供任何有用的交互方式。
我们将其称为PluginSurface
的“基准”表面类型。如果-为了简洁起见(实际上是通过Class Attributes完成的)-我们在表面上使用了一个属性来指示其目标类型,
PluginSurface.TargetType = typeof(Plugin)
Father : Plugin
Mother : Plugin
Daughter : Father
Son1 : Mother
Son2 : Mother
Grandson : Son1
PluginSurface
表示。因此,我们创建了更多表面来更具体地处理新插件的功能(所有表面均来自PluginSurface):
MotherSurface.TargetType = typeof(Mother)
GrandsonSurface.TargetType = typeof(Grandson)
Father -> PluginSurface
Daughter -> PluginSurface
Mother -> MotherSurface
Son1 -> MotherSurface
Son2 -> MotherSurface
Grandson -> GrandsonSurface
PluginSurface GetBestFitSurface(Type pluginType)
TargetType
检查其
pluginType
属性。更具体地说,它检查TargetType是否
IsAssignableFrom
插件类型。它创建所有正匹配的列表。
GrandsonSurface
是专门设计用来表示
GrandSon
的,因此它将是该插件的完整UI。但是
Son1
和
Son2
是“仅”获得
MotherSurface
的,因此,它们与
Mother
不共有的任何功能都不会包含在其UI表示中(直到建立了更专业的
Son
接口(interface),这时才是最好的)适合等)。请注意,这是预期的用途-通常,Mother插件将是抽象的,而针对它的接口(interface)实际上将是Son接口(interface),用于包装Mother的所有子级。因此,单个表面为整个类相似功能的插件提供了UI。
Type.IsAssignableFrom(Type)
的C++类似物,其中两种类型都被动态赋予。.我正在寻找
dynamic_cast
和
typeid
的方向,但是到目前为止,我还没有对如何做有一个牢牢的了解。它。有关体系结构,模式或实现细节的任何技巧将不胜感激。
最佳答案
一种选择是在您的Plugin基类中具有一个功能:
virtual std::string id() const { return "Plugin"; }
override std::string id() const { return "Grandson " + Mother::id(); }
id()
时,您会得到类似“孙子母亲插件”的信息。您可以将它扔给
std::stringstream ss(id);
,给我们一个
while (ss >> plugin_id)
,然后在表面容器中寻找使用
plugin_id
作为键...。
typeid
或
dynamic_cast
的方法,因为
typeid
不会告诉您基类(*),而且
dynamic_cast
必须知道在编译时要测试的类型。我假设您希望能够使用新的插件,并在不编辑代码的情况下更改id-> surface映射的某些文件或其他配置。
typeinfo
的方法。
关于c++ - C++中插件的“Best fit”动态类型匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20988296/
上下文 我有一个日间 TUMBLINGWINDOW(类似于下面所示的) SELECT DATEADD(day, -1, System.Timestamp()) AS WindowStart
因此,我正在开发一个非常小的 Web 组件,以作为更大的设计系统的一部分。 我对网络组件的使用有点陌生,但我知道这个特定的网络组件可以在一个布局中使用很多很多次。 此 Web 组件控制在传递给它的任何
我刚刚开发了一个 Android 应用程序(minSdkVersion 23/targetSdkVersion 29),可以连接到 BluetoothLE 设备以定期获取数据。 现在,在 MainAc
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the he
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 9 年前。 Improve
我一直在阅读有关 Airplay SDK 和 Dragonfire SDK 的内容。这些是在没有 Mac 的情况下进行 iphone 开发的合法选择吗?大家有更好的解决办法吗? 最佳答案 由于签名等原
我正在考虑使用 DTO 而不是传递我的域对象。我在这里和其他地方都读过几篇文章,我知道有几种方法可以完成这项工作。 如果我总共只有大约 10 个域类,并且考虑到我想在我的 View (WPF 前端)中
我的问题是,如果我有一个列表 list = [1,2,3,4,5,6,7] 如果我想知道这个列表中元素的数量,是len(list) 或 list.count 更好的选择?还是 .count 仅适用于来
我想知道 Django Rest Framework 的最佳实践。我一直通过每个用户使用不同的序列化程序(员工、帐户所有者、其他人)和 HTTP 方法来限制更改帐户上某些属性的访问权限,但我觉得这太不
我有数百个用于测试组件的脚本。这些脚本中的每一个都包含一组下标和单独的记录。 下标可以在多个 TC_Level 脚本中使用,甚至可以在其他下标中使用。 每个脚本都有一个唯一的名称。 例子: TC_1
我正在建立一个以两种语言提供产品信息的网站:英文和中文。 每个产品必须有英文名称,也可以有中文名称。 每次请求产品页面时,request检查对象以确定产品名称应该以英文还是中文显示。在后一种情况下,如
场景:应用程序具有可以启用某些优化的算法。默认情况下,有些是打开的,有些是关闭的。在 Java 中是否有一种方便的方法来实现某种全局属性系统? 要求: 必须很容易两次使用不同的设置运行程序的多个实例
我从事嵌入式工作,我有一些管理硬件的软件模块。这个模块有状态,状态转换很复杂:根据事件,模块可以从状态 A 到状态 B 或者可能到 C .但是,当它退出某个状态时,它应该对硬件执行一些操作,以使其也保
我有一个免费网站,可以流式传输实时股票期权数据。我想让用户制作并保存他们自己的 JavaScript 可调用工具来解释选项数据。用户可以调用这些自定义工具来帮助他们自己做出有关期权的买卖决定。 但对于
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 2 年前。 社区在 6 个
我不是 DBA,我不知道什么是最好的解决方案。我有两个表, Custumers Table CustomerId (primary key, identity) ... 和 Suppliers Tab
关闭。这个问题是opinion-based .它目前不接受答案。 想改善这个问题吗?更新问题,以便可以通过 editing this post 用事实和引文回答问题. 7年前关闭。 Improve t
我一直在阅读关于版本控制主题的所有问题,但我认为我没有找到一个看起来像我自己的场景。 场景是: 我们有一个中型/大型 Web 应用程序,它有(至少应该有)一个部署到所有客户端的核心。当我们向客户演示应
我希望根据继承来组织一些项目,目的是确定哪些项目是连接最密集的父项,并且还只是看到形成的连接。 通常这将通过拓扑排序来完成,但我的图有循环。是否有类似“尽力而为”拓扑排序的东西,它可以尝试根据连接数或
以下在 JQuery 中附加事件处理程序的方法有什么区别? (function () { var $body = $("body"); $('button').click(functi
我是一名优秀的程序员,十分优秀!