gpt4 book ai didi

design-patterns - 关于设计的问题(继承、多态)

转载 作者:行者123 更新时间:2023-12-04 23:10:08 25 4
gpt4 key购买 nike

我有一个关于我正在努力解决的问题的问题。希望你能忍受我。

想象一下,我有一个 Object 类,表示物理对象层次结构的基类。后来我从它继承来创建一个Object1D、Object2D和Object3D类。这些派生类中的每一个都有一些特定的方法和属性。例如,3d 对象可能具有下载供渲染器使用的 3d 模型的功能。

所以我会有这样的事情:

class Object {};
class Object1D : public Object { Point mPos; };
class Object2D : public Object { ... };
class Object3D : public Object { Model mModel; };

现在我有一个名为 Renderer 的单独类,它只需要一个 Object 作为参数,然后渲染它 :-)
以类似的方式,我想支持不同类型的渲染器。例如,我可以有一个每个对象都可以依赖的默认渲染器,然后为某种对象提供其他特定的渲染器:
class Renderer {};  // Default one
class Renderer3D : public Renderer {};

我的问题来了。渲染器类需要获取一个对象作为参数,例如在构造函数中,以便检索渲染对象所需的任何数据。

到现在为止还挺好。但是 Renderer3D 需要获取 Object3D 参数,以便不仅获取基本属性,还获取 3d 对象的特定属性。

构造函数看起来像这样:
CRenderer(Object& object);
CRenderer3D(Object3D& object);

现在我如何以通用方式指定它?或者更好的是,有没有更好的方法来设计它?

我知道我可以依赖 RTTI 或类似方法,但如果可能的话,我想避免这种情况,因为我觉得可能有更好的方法来处理这个问题。

提前致谢!

最佳答案

处理这种耦合的一种方法是使用工厂。通用工厂创建对象和渲染器。 2D 工厂创建 2D 对象和兼容的 2D 渲染器,3D 工厂创建 3D 对象和兼容的 3D 渲染器。

abstract class Factory {
abstract Object createObject();
abstract Renderer createRenderer();
}

class 2DFactory {
Object createObject() { return new 2DObject(); }
Renderer createRenderer() { return new 2DRenderer(); }
}

// similarly for 3D

class Client {
Client(Factory factory) { ... }
void render() {
factory.createRenderer().render(factory.createObject());
}
}

因此,如果您不混淆来自不同工厂的产品,您可以保持客户端代码干净。如果客户端代码一次只处理一个对象和渲染器系列,将适当的工厂传递给它是微不足道的,然后让它在不知道对象和渲染器的具体类型的情况下使用它们。对此的一个变体是让对象通过工厂方法创建兼容的渲染器,如 suggested by Jason .

另一种可能性是使用模板/泛型,但这是特定于语言的。你的实现语言看起来像 C++,所以我冒险朝这个方向发展。您可以使用模板特化:
template<class T> class Renderer {
void render(T object) { ... }
};

template<> class Renderer<Object3D> {
void render(Object3D object) {
// render the 3D way
}
};

// similarly for 2D

关于design-patterns - 关于设计的问题(继承、多态),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2610843/

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