我正在寻找一些关于为游戏对象设计类层次结构的建议。对于这个讨论,我将主要讨论两个特定的类。一个Object
和Sprite
。
是游戏中任何类型对象的Object
基类。Sprite
直接继承自Object
,但某些Object
公共方法不再有意义。这里有一些代码来解释:
class Object {
public:
Object() : renderer(NULL), controller(NULL), collider(NULL) { }
virtual ~Object();
Renderer *getRenderer() const;
Controller *getController() const;
Collider *getCollider() const;
void setRenderer(Renderer *renderer);
void setController(Controller *controller);
void setCollider(Collider *collider);
private:
Renderer *renderer;
Controller *controller;
Collider *collider;
};
Object
具有渲染器、碰撞器和控制器三个组件。 Sprite
当然有这三个组件,但使用一个SpriteRenderer
. 然后我想我不希望setRenderer
为 sprite 类公开该方法。
所以我认为我应该编写精灵类如下:
class Sprite : protected Object {
public:
Sprite(Texture *texture) : Object(), texture(texture) {
setRenderer(new SpriteRenderer(this));
}
Renderer *getRenderer() const;
Controller *getController() const;
Collider *getCollider() const;
void setController(Controller *controller);
void setCollider(Collider *collider);
private:
Texture *texture;
};
getter 和 setter 只调用相关的Object
方法。但在这种情况下,我不能真正使用Sprite
as an Object
,例如将它传递给一个接受 s 的函数Object
。
我的另一个实现是:
class Sprite : public Object {
public:
Sprite(Texture *texture) : Object(), texture(texture) {
setRenderer(new SpriteRenderer(this));
}
private:
Texture *texture;
};
这暴露了setRenderer
方法。
我的思考过程是,setRenderer
方法不应该暴露,因为 aSprite
是Object
带有 a 的SpriteRenderer
,所以如果它被改变了,那么它就不是 a Sprite
。但是,我没有看到一种明显的方法来防止它发生变化。
一般来说,这是我不应该担心的事情,还是有另一种方法可以进行这种设计?