2013-03-15 42 views
1

我正在創建某種成就係統,我有一個類KillXEnemies,然後從類KillXEnemiesWeapon(使用某種武器殺死的敵人)繼承它。而當你殺死一個敵人我環槽實現對象,並補充說,敵人已經被殺死同:Java intanceof false如果有父母

if(object instanceof KillXEnemies) 
    ((KillXEnemies)object).addEnemyKilled(); 

但後來因爲它是從KillXEnemies繼承KillXEnemiesWeapon被跟蹤。我知道有一個解決辦法是:

if(object instanceof KillXEnemies && !(object instanceof KillXEnemiesWeapon)) 
    ((KillXEnemies)object).addEnemyKilled(); 

但我要得到相當多的課程,從KillXEnemies繼承,它似乎是一個壞的解決方案有一個像20(目標的instanceof(---))

所以我想知道如果有檢查的對象不僅是KillXEnemies而不是KillXEnemiesWeapon

+1

很多時候,當你碰上的instanceof問題或確切類檢查問題衆多,這是一個次優繼承結構的標誌。這並不完全清楚你的實例是什麼,所以有點難以分辨...... – SeKa 2013-03-15 09:03:10

回答

5

您可以使用Object#getClass獲取對象的實際的類,然後比較,爲KillXEnemies.class一個更簡單的方法。

if (object.getClass().equals(KillXEnemies.class)) 

這將是objecttrueKillXEnemies但如果object是它的一個子類的實例。

但我不知道(並認識到你有很多更多信息,與比我做的工作,所以我可以很容易是錯誤的),如果類和子類是這個信息模型的最佳方式......

+0

+1用於調出潛在的子分類問題! – SeKa 2013-03-15 09:06:46

+1

如果你必須這樣解決問題,那麼你的方法有些問題。真的很難看的解決方案。 – Erik 2013-03-15 09:14:16

+0

@Erik:是的,這就是我在最後一句話中說的話。 :-) – 2013-03-15 09:33:53

0

使用窮人RTTI。使每個具體類都實現一個基本的getObjType()方法。 它可能比instanceof的森林更清潔更快。

switch(obj.getObjType()){ 
    case KillXEnemies.TYPE_ID: 
     doSomething((KillXEnemies)obj); 
    break; 
    case KillXEnemiesWeapon.TYPE_ID: 
     doSomething((KillXEnemiesWeapon)obj); 
    break; 
    //and so on ... 
} 
0

如何把一個標誌,像父類,這是所有子類的父類的真假?所以你的條件將是如果(對象instanceof KillXEnemies & &((KillXEnemies)對象).isParentClass()){

0

我會用重寫的方法做到這一點。有一個方法公開boolean doesKillEnemies()KillXEnemies。提供默認實現和wverride以使其在對象殺死敵人的類中返回true,並在所有其他子類中返回false。

測試就變成了:

if(object instanceof KillXEnemies && ((KillXEnemies)object).doesKillEnemies()) 
    ((KillXEnemies)object).addEnemyKilled(); 
1

也許考慮添加參數您addEnemyKilled()方法,包括一些元數據,如被打死敵人或已使用的武器等

這樣,類本身就可以使方法超載,並且將具有相應的相關信息。

(只是一個想法你怎麼能拿邏輯到類本身和出瘋狂的instanceof或類檢查的。)