避免使用Dynamic_cast而不增加耦合
avoiding dynamic_cast without increasing coupling
假设我想在以下代码中避免dynamic_cast
:
struct Base { ... stuff ... };
struct HasColor {
virtual Color getColor() const = 0;
virtual void setColor(Color) = 0;
};
struct Foo : public Base, public HasColor {
... implements HasColor methods
};
...
vector<Base*> collection;
...
for(auto element : collection) {
if(auto hasColor = dynamic_cast<HasColor*>(element)) {
hasColor->SetColor(myColor);
}
}
一种解决方案是添加一种方法以降低:
struct Base {
HasColor* toHasColor() { return nullptr; }
};
struct Foo : public Base, public HasColor {
...
HasColor* toHasColor() { return this; }
};
这意味着Base
需要了解每个Has
接口,增加耦合。
让我们尝试访客模式:
struct BaseVisitor {
void visitHasColor(HasColor& hasColor) = 0
};
struct Base {
virtual void visit(BaseVisitor& visitor) = 0;
};
但是我们遇到了相同的问题:每个Has
类都需要添加到BaseVisitor
中,导致更多的耦合并进行更多的重新编译(这是C ,每个对Base
的修改意味着等待几分钟(。
如果我想支持插件,情况会变得更糟。插件无法修改Base
或BaseVisitor
,因此插件无法添加其他Has
类。(我意识到典型的C RTTI在库之间可能无法正常工作,但是我看到了一个自定义的RTTI系统,显然是QT中的一个。(
我可以在保持代码扩展时避免RTTI/dynamic_cast
吗?
这个问题似乎相似。就我而言,我首先对代表我的数据表示愿意。
(建议避免使用C 样式指南中的dynamic_cast
。(
如果您有各种各样的集合,有些是 HasColor
,而另一些则不是,那么您必须依靠 dynamic_cast
或类似的rtti才能将对象用作 HasColor
或者,您必须使用访问者模式将依赖关系倒置,这引入了您的问题。
不需要使用dynamic_cast
或其他RTTI的解决方案是仅使用HasColor
实例的集合。
相关文章:
- 数组索引的值没有增加
- 为什么我的代码在输出中增加了93天
- 有效地使用std::unordered_map来插入或增加键的值
- C++ 动态数组每次添加时将大小增加 1 - 错误
- 为什么要增加导致崩溃的指针
- 增加传递地址的值
- 如何增加以前由新运算符分配的 C++ std::list 数组的大小?
- 为什么"i"在循环的每次迭代中都没有增加?(C++)
- std::thread 增加 DLL 引用计数,从而防止卸载 DLL
- 如何在C++中为增加但记住删除先前对象的对象分配唯一标识符
- 将一对插入地图并增加计数?
- 整数类型应该显式转换(例如"int"到"无符号")还是只会增加混乱?
- 我的 c++ 应用程序中的运行时间从 0 增加到 60 太快了(例如一毫秒或一微秒)
- 为什么当通过 TCP 发送的消息速率增加时,请求-响应消息对的延迟会降低?
- 琐碎并发代码的吞吐量不会随着线程数量的增加而增加
- C++:功能在输出前自动使用50减/增加输入数
- 追加位以增加字符的大小
- 为什么在C++中增加指针后打印了一个值而不是 NULL/0?
- 避免使用Dynamic_cast而不增加耦合
- 继承是否会增加耦合