2011-05-23 2 views
0

私はUserの配列を持ち、各オブジェクトは実際にはUserの2つのクラスのうちの1つであるとします。 ComputerUserおよびHumanUserはいずれもUserです。このオブジェクトはどの拡張クラスですか?

私がリストを反復していると仮定し、各オブジェクトの名前はoです。 oComputerUserHumanUserであれば

は、私は単純に、このように比較することで把握することができます:

if (o instanceof ComputerUser) { 
    ... 
} 

if(o.getClass().equals(ComputerUser.class)) {} 
else if(o.getClass().equals(HumanUser.class)) {} 
+0

自分でテストするのは簡単ではありませんか? –

+0

私が確認する前にコードの他のバグ、私は誰かが頭の上から知っているかもしれないと思った。 –

答えて

2
if (o instanceof ComputerUser) 

など

+0

'User'sの配列に保存されていますが?それは 'User'だとは思わないでしょうか? –

+1

instanceofオブジェクトを参照する変数の静的型ではなく、オブジェクトの動的型をチェックします。 –

2

あなたはinstanceof演算子を使用することができますこれはオブジェクト指向プログラミングの貧弱な使用とみなされます。代わりに多態性を活用して、ComputerUserとHumanUserのふるまいを以下のように定義します。

abstract class User { 

    abstract public void work(); 

} 

class ComputerUser extends User { 

    @Override 
    public void work() { 
     ... 
     //specific to ComputerUser 
    } 

} 

class HumanUser extends User { 

    @Override 
    public void work() { 
     ... 
     //specific to HumanUser 
    } 

}