0

洗練された 2D エンジンと独自のエンティティ エンジンを使用してゲームを作成し、2D サイド スクローラーの詳細を作成しています。

私のコードが現在機能する方法は次のとおりです。

エンティティ クラスは、エンティティ情報を保持します。アニメーション、音、動きなどの能力を持つことができます。すべての能力は、能力と呼ばれる抽象クラスのサブクラスです。

特定の能力のインスタンスを取得したい Entity クラスにメソッドがあり、そのメソッドを使用できるようにします。

 public Ability getAbility(String id) {
    for(Ability abil : ablitites) {
        if(abil.getId().equalsIgnoreCase(id)) {
            return abil;
        }
    }
    return null;
}

ただし、これはスーパークラス、Ability の特定のインスタンスのみを返します。別のパッケージまたはクラスからサブクラスのインスタンスを取得したいと考えています。

これを行うコードのサンプルをいただければ幸いです。ありがとう

4

2 に答える 2

0

私はあなたの質問を完全には理解していませんが、あなたはキャスティングを見てみるべきだと思います。

私はあなたがこのようにあなたのコードを使うべきだと思います:(
もちろん、私はあなたのデザインの手がかりを持っていないので、私は少し推測しています)

Ability ability = getAbility("moveLeft");
if (ability instanceof MoveAbility)
{
    // Right here, we know it IS a MoveAbility because we checked it with
    // instanceof

    // So, we can cast it to a MoveAbility.
    MoveAbility moveAbility = (MoveAbility) ability;
    moveAbility.execute();
}
于 2011-12-27T00:39:11.707 に答える
0

あなたのコードはすでにあなたが望むことをしていると思います。ablititesコレクションがAnimationSound、およびMovementオブジェクトのインスタンスをすでに保持している場合、それがメソッドから返されます。Ability 参照を通じてそれらを返すだけです。Ability抽象クラスであるため、スーパークラスのインスタンスを返すことはできません。で宣言されている共通メソッドを呼び出して、メソッドAbilityによって返されたオブジェクトが、要求した特定のサブクラスのインスタンスとして動作することを確認できる必要があります。

于 2011-12-27T00:41:12.813 に答える