2011-12-27 7 views
0

私は2Dサイドスクローラーの詳細を動作するように滑らかな2Dエンジンと私自身のエンティティのエンジンを使用してゲームを書いていますから、サブクラスのインスタンスを取得するは別のクラス

私のコードは、現在の動作方法は次のようですこれは:

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

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

はしかし、これが唯一のスーパークラスの特定のインスタンスを返します。

は、私はそのメソッドを使用することができるように、私は、特定の能力のインスタンスを取得したいエンティティクラスのメソッドを持っています、能力。私は別のパッケージまたはクラスからサブクラスのインスタンスを取得したい。

これを実行するコードのサンプルは高く評価されます。ありがとう

答えて

0

私はあなたの質問を完全に理解していませんが、Castingをご覧ください。

私はあなたがこのようなあなたのコードを使うべきだと思う:
(もちろん、私はあなたのデザインの見当がつかないので、私は少し推測している)

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(); 
} 
+0

これは素晴らしいです。私はこれについて考えましたが、instanceofがjavaのno-noであるかどうかはわかりませんでした。しかし、これは動作します。 –

0

私はあなたのコードがすでにやっていると思いますあなたが欲しいもの。 ablititesコレクションにすでにAnimation,SoundMovementというオブジェクトが含まれている場合は、その方法が返されます。 Abilityの参照に返されます。抽象クラスなので、スーパークラスAbilityのインスタンスを返すことはできません。 Abilityで宣言されている一般的なメソッドを呼び出して、メソッドから返されたオブジェクトが要求した特定のサブクラスのインスタンスとして動作することを確認できます。

+0

これは役に立ちますが、別のクラスのサブクラスメソッドにアクセスすることはできません。一般的なものだけ –

+0

@Young_Makerはい、そのメソッドから取得するとすぐにオブジェクトを正しい型にキャストする必要があります(あなたが 'id'文字列から実際にどのような型かを知っている時には –

+0

、これはMartijn Courteauxが言ったことです。 –

関連する問題