gpt4 book ai didi

C++ 设计 : inheritance and returning opaque handles

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:48:55 25 4
gpt4 key购买 nike

我有两个如下所示的界面:

class IThing {
...
virtual IHandle* getHandle(void) = 0;
virtual void useHandle(IHandle *handle) = 0;
};

class IHandle { ... }

我希望用户能够实现 IThing 和 IHandle。例如,如果用户创建了 MyThingMyHandlegetHandle 应该返回一个指向 MyHandle 的指针,用户稍后可以在 useHandle 中使用。

这会起作用,但我不喜欢这种设计,因为 IHandle 的多个实现可能会在 IThing 的实现之间混淆。同样在 useHandle 中,用户需要显式向下转换为他们的 IHandle 实现。是否有更类型安全的方法来执行此操作?

最佳答案

我不太确定你想设计什么。但这里有一些想法,希望对您有所帮助。

基本原则是从IThing 公开派生的类确实是IThing。因此,您可以用 IThing 做的所有事情,您都可以用 MyThing 做,包括获取 IHandle

没有设计问题,只要您的 IHandle 派生都遵循相同的原则。这意味着您的东西不应该对特定句柄做出任何假设,反之亦然。

但是,如果您在 MyHandle 的实现中使用假设它与 MyThing 链接(反之亦然),您将遇到您描述的问题。事实上,您使用的依赖项未在您的类定义中表达。所以是的,你必须使用沮丧。这很不舒服,因为它揭示了设计问题。

由于您的类是多态的,您可以通过使用 dynamic_cast 检查 nullptr 来限制向下转型的风险。但这是一种解决方法,而不是设计改进。

或者,您可以考虑使用模板。它们可以帮助您在编译时链接相关类型。您将获得类型安全性,但您将失去运行时多态性的一些灵 active 。一种示例方法:

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++ 设计 : inheritance and returning opaque handles,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32917331/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com