2012-08-13 59 views
0

我需要關於接口的建議。我有一個單位可以攻擊其他單位。攻擊可以是空中或地面。我需要單一的方法來實現攻擊,稱爲attack()。有些單位只能攻擊地面單位,一些空中單位或兩者。接口實現隱藏方法

這是我想出迄今:

public interface Attack() { 
    public void attack(SCObject object); 
} 

public interface GroundAttack() extends Attack { 
    public void groundAttack(SCObject object); 
} 

public interface AirAttack() extends Attack { 
    public void airAttack(SCObject object); 
} 

我可以有不同的單位:

Unit extends SCObject implements GroundAttack { 
} 

Unit extends SCObject implements AirAttack { 
} 

Unit extends SCObject implements AirAttack, GroundAttack { 
} 

問題是這樣的實施將揭示兩個地面和空中的選項,而我只想要attack()方法可見。 你可以提出解決方案嗎?或者這對你看起來好嗎?

+0

您的限制(空對地​​)是靜態的(即可在編譯時解析)還是動態的運行) ? – 2012-08-13 10:06:51

+0

在運行時解決此問題 – 2012-08-13 10:15:52

回答

4

我會用

public interface Attack { 
    public boolean canAttack(SCObject object); 
    public void attack(SCObject object); 
} 

我不明白了一個道理有一個特定的地面或空中攻擊方法給你不想揭露這種行爲。

+1

訪問者模式在此也可能有用。 – duffymo 2012-08-13 10:07:42

+0

@BrianAgnew感謝您解決錯別字。 – 2012-08-13 10:08:31

+0

如果你沒有實現任何接口單元不能發起攻擊。並且不實施AirAttack的單位不能攻擊飛行單位。 – 2012-08-13 10:09:57

3

我覺得visitordouble-dispatch模式可以適用於此,因爲有能力攻擊依賴於攻擊者和受害者之間的相互作用。

某些形式的調用,攻擊者attacks(),並通過本身作爲參數將允許受害者確定攻擊的有效性。請注意,這可以允許您在運行時改變攻擊能力(例如,「地面」單元可以空中飛行嗎?)