このタイプのクラス階層をどのように処理するかについて質問がありました。階層はゲームに関連していますが、私はそれがgamdev上でここに行くのに十分一般的だと思います。私はこの種のことが時折起こると思いますので、私は可能な解決策について興味がありますクラス階層を処理する方法
私のゲームで文字を定義するBaseCharacterという基本クラスがあります。それはベースライン文字を持つためにすべての基本的な統計、ステータス効果の保持者、イベントなどが含まれています。私のゲームロジックのほとんどは、BaseCharacterのエンティティで動作し、必要に応じてキャストします。
そこから、ヒューマノイドクラスを継承し、必要な構造とメソッドを追加してキャラクターに装備(武器、防具など)を加え、最後にヒューマノイドの真中にあるPlayableCharacterクラスを持っています。 EXP、設定可能な能力構造など
だから、クラス構造は単純です:
BaseCharacter --->ヒューマノイド---> PlayableCharacter
この構造はIものの、プレイヤー側の文字を定義するための素晴らしい作品構造をもう少し洗練することを決めるかもしれない。私は階層に「敵」クラスを追加できなければなりません。敵の要件を満たすために、敵や戦利品のテーブルなどを倒すためのEXP /ポイントに関連するデータ構造やメソッドを追加する必要があります。
問題はどこにこれらの構造を追加しますか?私は基本的にすべてのキャラクターが敵のエンティティに必要なメソッド/データ構造を持っていると言っているので、それらをBaseCharacterに追加することは悪い考えです。私は次のようになるクラスの別のストリームを開始することを考えました:
BaseCharacter--->Humanoid--->PlayableCharacter
\---->Enemy--->EnemyHumanoid
ここで、敵はBaseCharacterから継承します。 EnemyHumanoidは、BaseCharacter-> Humanoidからの継承と同じメソッド/データ構造のセットを追加します。これは動作しますが、EnemyHumanoidがHumanoidの要件を満たしているにもかかわらず、EnemyHumanoidをHumanoidにキャストすることはできません。これはまた、私はこれらの2つの継承がオブジェクト/メソッドの全く同じセットを追加するので、冗長性を追加します。
はその後EnemyInterfaceと呼ばれる別々のクラスを使用すると考えられており、このような継承階層で終わるには:
BaseCharacter----->Humanoid----->PlayableCharacter
| |
V V
Enemy EnemyHumanoid
敵とEnemyHumanoidすべてEnemyInterfaceを実装します。しかし、私は今Enemy < - > Enemy Humanoid関係を失う。私はここで複数の魅力を使うべきですか? (Enemy Humamoid inheirt in Enemy and Humanoid?)は、悪い形であると考えられていますか?これを行うより論理的な方法はありますか?ここの例はかなりシンプルですが、私がクラス階層をさらに分割すると、もっと複雑になります。
すべてのヘルプは、あなたが再利用のための継承を使用する代わりに地獄へのパスであるLSP(http://en.wikipedia.org/wiki/Liskov_substitution_principle)、に付着しているようですね