2012-03-14 112 views
1

我正在爲Android製作一款足球遊戲。訪問其超類的子類中的調用方法

我有一個類播放器。玩家由DefencivePlayer和OffensivePlayer擴展。每個類都實現了一個觸摸事件,它們都是唯一的。我有另一個班級,移動者,處理可以訪問播放器的觸摸。 (如下所示)

FootballGameUML

播放器是始終或者是DefencivePlayer或OffensivePlayer。我希望能夠通過簡單地調用Player.touch來處理觸摸的功能,並且根據它們的不同,相應的觸摸方法將在DefencivePlayer或OffensivePlayer中調用。

我相信我的設計有兩個類擴展Player類是錯誤的,因爲它不能確保有子類。

請幫助,我真的想在這裏得到一個好的設計,不想破解任何東西。

+0

我遇到的問題是猶豫。我想要的功能正是我的程序如果我已經測試過它的行爲。我認爲子類中的方法會被忽略,因爲它們不需要存在。感謝所有非常快速的回覆 – ChickenKitty 2012-03-14 06:23:04

回答

2

我做了一個快速測試 - 使用類圖,我成立了三個播放器類和創建攻防球員的通用ArrayList<Player>列表。打印出這個代碼的結果:

players.add(new OffensivePlayer()); 
players.add(new DefensivePlayer()); 
players.add(new OffensivePlayer()); 
players.add(new OffensivePlayer()); 
players.add(new DefensivePlayer()); 

for(Player p: players) 
    p.touch(); 

給了我這樣的輸出:

Touched offensive player. 
Touched defensive player. 
Touched offensive player. 
Touched offensive player. 
Touched defensive player. 

換句話說,不同類型的球員被解釋爲子類,而不是僅僅作爲Player一個實例。

從設計的角度來看,這可能是值得做Player一個抽象類,從而確保沒有純Player對象被創建,從而touch()方法將只從一個Player子類的實例來執行。

0

我不確定我是否正確理解您的問題,但目前的設置似乎沒有任何問題。

只要Touch()方法是abstract(使Player聲明爲abstract class Player),或球員被定義爲interface Player,你將能夠使用player.Touch(),並確保實現的方法被調用。

0

您可以製作Player.Touch()abstract。這將確保子類將提供自己的實現。