- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
需要 dynamic_cast
通常被认为是糟糕的设计。然后考虑这种情况:
ABC
;D1
, D2
...D100
;Ds
对象的应用程序;那些 Ds
对象需要存储在某个容器中,所以我将它们存储为 ABC*
。
当我需要搜索特定类型的节点时,我需要将它们全部dynamic_cast
并返回“好的节点”。存在 dynamic_cast
的替代方案,但它们的实现细节多于严格的设计:
AsD23()
返回一个 D23*
如果 this
是一个 D23*
并且nullptr
否则;在这两种选择中,唯一改变的是检查 ABC 是否实际上是 D42
的方法。这就是为什么我认为这更多的是实现细节而不是设计选择。 我说得对吗?
那么,如果是,在这种特殊情况下,在设计方面什么是好的替代方案(如果有的话)?
最佳答案
一种方法是更改容器:使用 std::multimap<std::type_index,ABC*>
(或者 std::unordered_multimap<std::type_index,ABC*>
如果你可以访问 C++11)来存储你的对象,使用它们的 type_id
作为键( std::type_index
扭曲 type_id
)。通过这种方式,您可以非常快速地获得特定类型 - 在对数时间内使用 std::multimap
或在恒定时间内使用 std::unordered_multimap
(当然,迭代实际对象与需要迭代的特定类的对象数量成线性关系)。
这种方法的一个缺点是它依赖于 type_id
: 它可以让你快速到达一个特定的子类,但如果你的类型层次结构在未来变得更复杂,比如说,你添加 ABC
的子类,比如说,BCD1
, BCD2
, ..., 作为您派生类型的一些 的基类,上述方法不允许您搜索 BCDx
的所有对象,因为您需要传递“最终”类型的 ID,即 D...
之一
请注意,在容器中使用原始指针并不理想 - 考虑将其替换为智能指针,例如 std::unique_ptr<ABC>
或 std::shared_ptr<ABC>
.
关于c++ - 如何在设计层面移除 dynamic_cast,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24323243/
我正在做一个项目,我的 android 在这个项目中作为一个网络服务器工作;输入带端口号的 IP 地址,打开 Web 界面,用户可以将文件上传到手机。我想在 Web 界面上显示一些图片,以便我们的界面
我是一名优秀的程序员,十分优秀!