ゲーム オブジェクトのクラス階層の設計に関するアドバイスを探しています。この議論では、主に 2 つの特定のクラスについて話します。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には、レンダラー、コライダー、コントローラーの 3 つのコンポーネントがあります。 Spriteもちろん、これら 3 つのコンポーネントがありますが、SpriteRenderer. setRenderer私は、スプライトクラスにメソッドを公開したくないと考えました。
そこで、スプライト クラスを次のように記述すべきだと考えました。
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;
};
ゲッターとセッターは関連するObjectメソッドを呼び出すだけです。しかし、この場合、 をSpriteとして実際に使用することはできませんObject。たとえば、 を受け取る関数に渡すなどObjectです。
私の他の実装は次のとおりです。
class Sprite : public Object {
public:
Sprite(Texture *texture) : Object(), texture(texture) {
setRenderer(new SpriteRenderer(this));
}
private:
Texture *texture;
};
メソッドを公開しsetRendererます。
私の思考プロセスは、 aがaであるsetRendererためにメソッドを公開すべきではないということです。ただし、変更を防ぐ明確な方法はわかりません。SpriteObjectSpriteRendererSprite
一般的に、これは私が心配する必要のないものですか、それともこの設計を行う別の方法はありますか?