c++设计:继承和返回不透明句柄
c++ design: inheritance and returning opaque handles
我有两个像这样的接口:
class IThing {
...
virtual IHandle* getHandle(void) = 0;
virtual void useHandle(IHandle *handle) = 0;
};
class IHandle { ... }
我希望用户能够实现IThing和IHandle。例如,如果用户创建了MyThing
和MyHandle
,那么getHandle
应该返回一个指向MyHandle
的指针,用户可以稍后在useHandle
中使用该指针。
这将工作,但我不喜欢这个设计,因为IHandle
的多个实现可以在IThing
的实现之间混淆。同样在useHandle
中,用户需要显式地向下转换到他们的IHandle
实现。是否有更类型安全的方法来做到这一点?
我不太确定你想设计什么。但这里有一些想法,我希望能有所帮助。
基本原则是,从IThing
公开派生的类确实是IThing
。所以你可以用IThing
做的所有事情,你也可以用MyThing
做,包括获得IHandle
。
没有设计问题,只要你的IHandle
衍生品都遵守相同的原则。这意味着你的东西不应该对特定的手柄做任何假设,反之亦然。
然而,如果你在MyHandle
的实现中使用它与MyThing
相关联的假设(反之亦然),你将陷入你所描述的麻烦。实际上,您使用的是类定义中没有表示的依赖项。所以,是的,你必须使用下cast。它让人不舒服,因为它暴露了一个设计问题。
由于您的类是多态的,您可以通过使用dynamic_cast
检查nullptr来限制向下转换风险。但这是一种变通方法,而不是设计改进。
或者你可以考虑模板。它们可以帮助您在编译时链接相关类型。您将获得类型安全性,但将失去运行时多态性的一些灵活性。一个示例方法:
template <class IH>
class IThing {
public:
virtual IH* getHandle(void) =0;
virtual void useHandle(IH *handle) =0;
};
class MyHandle { }; // to keep it simple,
class MyThing: public IThing<MyHandle> {}; // instantiation with specific handle
int main() {
MyThing i;
MyHandle *h;
h = i.getHandle();
...
}
本例中的约束是,您不能使用不同的句柄混合不同的IThings
。
相关文章:
- 在C++中返回不正确的楼层函数值
- CreateDIBSection为同一图像返回不一致的位图位值
- 返回不需要的值的二叉搜索程序
- 如何创建子窗口是透明的,父窗口是不透明的?
- 为什么我不能返回带有透明函子的法线映射引用?
- inet_ntop返回不存在的地址
- 从静态库使用时隐藏不透明结构的内容
- 返回不停止函数,递归函数问题?(编程练习,动态规划,Levenshtein 回溯)
- 对于指向C++类的不透明C指针,正确的typedef是什么
- void 函数中的指针参数返回不一致的值
- wcslen() 在使用编译指示包时返回不正确的结果
- 为什么函数返回不移动向量?
- 使用返回不完整类型的函数作为默认参数
- 使用 pybind11 混合类型转换和不透明类型
- 处理 pybind11 中的不透明指针
- 来自 cmath 库的 asin() 函数返回不准确的值
- 访问range_expression中的嵌套元素会返回不完整的映射(段错误)
- 尝试编写函数尝试从字符串中提取数字,但它返回不相关的数字
- Pybind11在不透明载体的不透明载体上访问
- c++设计:继承和返回不透明句柄