2013-04-17 3 views
5

私はこの質問の変種を見たことがありますが、私の問題に本当に対処できません。クラスが別のクラスを継承しているかどうかを確認する方法

私はクラスで軍隊を建設していると言います。私の継承構造の先頭には、抽象的な「Unit」クラスがあります。その後、抽象的な "飛行"、 "グラウンド"および "建物"クラスを拡張します。その後、フライングを拡張する具体的な "ヘリコプター"と "Jet"クラス。コンクリート「兵士」と「タンク」は、グランドを延長するクラスです。最後に建物を拡張する「HQ」と「Supply」となります。私はは、ユニットのいずれかの形式になりたい

public void attack(Unit enemy){ 
if(enemy.getSuperclass().equals(Flying)){ 
    System.out.print("Soldiers cant attack flying units"); 
} 
else{ 
    //Code to attack enemy here 
} 

次は「兵士」クラス下の方法です。これは、兵士が建物と他の地上ユニットの両方を攻撃できるはずですが、私は兵士が飛行物体を攻撃できるようにしたくありません。

明白な問題は、私はユニットとしてを宣言したので、それはそれが属するため、存在していないユニットのスーパークラスを見つけようとしているサブクラスを知らないということです。

ユニットのタイプを手動で設定しているすべてのユニットにゲッタを持たせることができると確信していますが、それはより多くの作業で効率的ではありません。 enemyFlyingから派生クラスのいずれかのインスタンスであるかどうかを確認、というよりもFlyingクラスのために特別にをチェックします

if(enemy instanceof Flying){ 

+2

ワウ、同じ5秒間のタイムスライスで公開された5つの同等の回答! –

+2

クラス継承はallをモデル化するのに制限的かもしれないので、インタフェースを使用することもできます。しかし最初に継承を試みるのは大丈夫です。 –

+1

* instanceof *驚き! – NINCOMPOOP

答えて

11

変更

if(enemy.getSuperclass().equals(Flying)){ 

(ました私たちはが抽象であるので、enemyができないことを知っています。

instanceof私はそれを使うたびに(そして時々そうする)、私はそれを避けるためにリファクタリングする方法を見つけることができることを期待して私の構造を見直します。兵士はいくつかの共通の特徴を持っており、Unitの代わりに引数として使用できる抽象的なUnitサブクラス  — GroundBasedまたは何か  —を実装することができます。この場合、あなたはできないかもしれませんが、二重チェックの価値があります。

+0

クラスデザインを再考することは良いアドバイスです。良い方法は、インタフェースを使用して、サブクラスのユニットに共通部分を実装することです。インターフェイスを使用すると、クラスが別のクラスの特定の実装から派生していることを心配する必要はありませんが、bevhiourが同じであることを確認することはできます。 – Devolus

+0

はい、しかし、インターフェースでは、下の具象クラスに適用するクッキーカッターメソッドを作成できません。私はすべてのユニットのためのメソッドを再作成する必要があります。私が正しくインターフェイスを理解していない限り。 – KroniK907

1
if (enemy instanceof Flying) 
    ... 
1

あなたは試すました:

if (enemy instanceof Flying) 
2

instanceof演算子を使用してみてください。

if(enemy instanceof Flying){ 
     System.out.print("Soldiers cant attack flying units"); 
    } 
    else{ 
     attack(enemy); 
    } 
1

私はあなたがinstanceofoperatorを探していると思います。

オペレータinstanceofオペレータは、オブジェクトを指定されたタイプと比較します。これを使用して、オブジェクトがクラスのインスタンス、サブクラスのインスタンス、または特定のインタフェースを実装するクラスのインスタンスであるかどうかをテストできます。

だからあなたはあなたが以下のように機能更新することができます。

if(enemy instanceof Flying){ 
    System.out.print("Soldiers cant attack flying units"); 
} 
else{ 
    attack(enemy); 
} 
1

をあなたはこのためにinstanceofを使用することができますif(enemy instanceof Flying) {}

2

を試してみてください。これは、すなわちインターフェースに対しても機能する。

instanceofを使用しているときに変数がnullでないことにも注意してください。

クラスBは、これは、設計臭いある

public class test 
    { 
    public static void main(String[] args) 
    { 
     A a = new B(); 
     B b = new B(); 
     if(a instanceof A) 
      System.out.println("B derived from A"); 
     if(b instanceof A) 
      System.out.println("B derived from A"); 
    } 
    } 
0

を拡張します。基本的な要件はVisitor patternの仕事ですが、Visitorに到達する前に、これよりも多形性をよく使うようにする必要があります。

関連する問題