gpt4 book ai didi

c++ - 内部引擎实现的 static_cast 接口(interface)类

转载 作者:行者123 更新时间:2023-11-28 07:34:28 25 4
gpt4 key购买 nike

我正在开发一个 3D 引擎,假设我有以下接口(interface)类:

class IA {
public:
virtual ~IA() {}
virtual void doSomething() =0;
};

class IB {
public:
virtual ~IB() {}
virtual void bindA( IA* ) =0;
};

如果您想要获得“IA”或“IB”类型的对象,您必须从依赖于所使用的后端 API(例如 OpenGL)的工厂中获取它们。函数 IB::bindA(IA*) 需要从 IA 的实现中访问数据,并为此对实现类执行 static_cast,然后直接访问它的元素。

我想知道您如何看待 static_cast 的这种特殊用途,您认为这是糟糕的设计吗?还是你觉得可以?

无论使用什么后端 API,引擎都必须提供相同的接口(interface),所以我不认为我可以使用虚函数来实现这一点,因为我无法事先知道 IB 从 IA 需要什么。

谢谢:D

编辑

问题是引擎有以下两个类:

class IHardwareBuffer {
public:
virtual ~IHardwareBuffer() {}
virtual void allocate( .... ) =0;
virtual void upload( .... ) =0;
};

class IMesh {
public:
virtual ~IMesh() {}
virtual bindBuffer( IHardwareBuffer* ) =0;
...
};

我“可以”将 IMesh 和 IHardwareBuffer 类合并在一起,但这没有多大意义,因为 HardwareBuffer 只是一 block “哑”内存,其中包含顶点数据,而 Mesh 是一个或两个 HardwareBuffers它们周围的其他数据,如顶点格式、 Material 等。让它们成为单独的类允许客户端代码让多个网格共享一个公共(public)的 HardwareBuffer 和类似的东西。

最佳答案

在我看来,从设计的角度来看,这实际上是一个相当糟糕的主意。

如果你使用接口(interface)(或者模拟它们,因为 C++ 没有这样的语言结构),你使用它们来发布这些数据,这些数据在其他地方需要。因此,如果实现 IB 的对象必须将 IA 强制转换为某些内容以检索其数据,这显然是一个标志,即 IA 发布的数据不足或者实现 IA 的对象还应该实现另一个更广泛的接口(interface)。

很难说哪个选项更好(或者如果有另一个),因为我们不知道这里的上下文。一般来说,如果真的没有必要,应该避免强制转换,而且这里肯定没有必要。


编辑:

无论使用什么后端 API,引擎都必须提供相同的接口(interface),所以我不认为我可以使用虚函数实现这一点,因为我无法事先知道 IB 从 IA 需要什么. - 这是一个糟糕的设计。

引擎应该以这样的方式编写,它完全独立于使用它的实现,反之亦然。这就是使用接口(interface)、基类和多态性的全部要点:您应该能够编写另一个引擎,将其与现有引擎交换,并且一切都应该可以正常工作,而无需对实现进行任何更改。


编辑(回应评论):

我认为,更明确的解决方案是转换到另一个接口(interface),而不是特定的实现,即:

class A : public IA, public IInternalA
{
// Implementation
};

// Inside B:
void B::Process(IA * a)
{
IInternalA ia = dynamic_cast<IInternalA *>(a);

if (ia != nullptr)
// Do something
}

这样你仍然可以从实现中分离出来(例如,你可以将它分成两个独立的部分),但是在你的引擎内部,所有的类都会相互了解足够的信息来工作

关于c++ - 内部引擎实现的 static_cast 接口(interface)类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17017060/

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