ゲーム オブジェクトのクラス階層の設計に関するアドバイスを探しています。この議論では、主に 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
ためにメソッドを公開すべきではないということです。ただし、変更を防ぐ明確な方法はわかりません。Sprite
Object
SpriteRenderer
Sprite
一般的に、これは私が心配する必要のないものですか、それともこの設計を行う別の方法はありますか?