2013-04-04 79 views
0

我不知道這是否會真正使任何意義(我有點糊塗我自己),但我試圖做的就是創建一個小遊戲插件,我試圖使它在地圖之間循環,我創建了一個新的類,它擴展了BaseGame,我將插件實例,世界名稱和xml文件名傳遞給超類BaseGame,然後basegame類從xml文件和設置變量中解析信息。我在一邊有些方法延長BaseGame因爲大多數地圖都有不同的遊戲類型,所以我需要爲不同的事件例如在TDM我需要停下來的球員打破做不同的事情類本,所以我想這樣做在聽者返回擴展分類

@EventHandler 
public void blockDestroy(BlockBreakEvent event) { 
    plugin.mapCycler.getCurrentWorld().onBreakEvent(event); 
} 

我面對的問題是從MapCycler類返回當前的世界,因爲所有的地圖類都有不同的方法,我需要一種方法來返回地圖類的一般方法,該方法可以返回所有擴展BaseGame的地圖類,但我仍然需要能夠訪問擴展BaseGame的類中的方法。

請告訴我,如果你需要進一步澄清。

感謝

編輯1:

在BaseGame類,它就是將所有擴展BaseGame例如這些方法的世界類使用將在所有擴展BaseGame

類使用常見的方法
public String getMapName() { 
    return xmlFileReader.getMapName(); 
} 


public String getMapObjective() { 
    return xmlFileReader.getMapObjective(); 
} 
    public void resetInventory(Player player) { 
    player.getInventory().clear(); 
    player.getInventory().setArmorContents(null); 
    player.setHealth(20); 
    player.setFlying(false); 
    player.setGameMode(GameMode.SURVIVAL); 
    player.setFoodLevel(20); 
} 

和擴大BaseGame類它將具有獨特的方法,該方法涉及到世界例如類

public void blueWin() { 
    Bukkit.getServer().broadcastMessage(Messages.colorize("Blue win - nice message in update")); 
    for(String player : blueTeamList) { 
     Player blue = Bukkit.getServer().getPlayer(player); 
     resetInventory(blue); 
     Packet206SetScoreboardObjective packet = new Packet206SetScoreboardObjective(plugin.relicWorld.sb.getObjective(plugin.relicWorld.name), 1);//Create Scoreboard create packet 
     sendPacket(blue, packet); 
     String loc = DatabaseManager.getLastLoc("SELECT * FROM ag_users WHERE user = \'" + blue.getName() + "\'"); 
     blue.teleport(LocationManager.stringToLoc(loc)); 
     Bukkit.getServer().dispatchCommand(Bukkit.getServer().getConsoleSender(), "eco give " + blue.getName() + " 250"); 
    } 
    for(String player : redTeamList) { 
     Player red = Bukkit.getServer().getPlayer(player); 
     resetInventory(red); 
     Packet206SetScoreboardObjective packet = new Packet206SetScoreboardObjective(plugin.relicWorld.sb.getObjective(plugin.relicWorld.name), 1);//Create Scoreboard create packet 
     sendPacket(red, packet); 
     String loc = DatabaseManager.getLastLoc("SELECT * FROM ag_users WHERE user = \'" + red.getName() + "\'"); 
     red.teleport(LocationManager.stringToLoc(loc)); 
     Bukkit.getServer().dispatchCommand(Bukkit.getServer().getConsoleSender(), "eco give " + red.getName() + " 50"); 
    } 
    Bukkit.unloadWorld(getWorld(), false); 
    resetAll(); 
} 

因爲它是世界獨一無二的。

+0

請張貼一個示例,顯示您可能需要調用不同對象的方法。常用的方法有哪些? – 2013-04-04 16:14:41

+0

我已更新我的帖子。 – DCSoftware 2013-04-04 16:23:12

回答

1

他們關鍵是你需要定義一個統一的接口,爲您的世界對象。然後,你可以調用相同的方法(在基類/接口中定義的),並通過多態性當調用plugin.mapCycler.getCurrentWorld()應該返回一個World對象,即,它實現了World每個子類可以不同的反應

interface World{ 
    public void onBreakEvent(BlockBreakEvent e); 
} 

class World1 extends BaseGame implements World{ 
    public void onBreakEvent(BlockBreakEvent e) { 
     System.out.println("Breaking from world 1") 
    } 
} 

class World2 extends BaseGame implements World{ 
    public void onBreakEvent(BlockBreakEvent e) { 
     System.out.println("Breaking from world 2") 
    } 
} 

現在接口。每個對象都可以作出不同的反應,但因爲它們都共享接口,所以可以將它們視爲相同。

plugin.mapCycler.getCurrentWorld().onBreakEvent(event); 
+0

跳過擴展BaseGame類的部分 – DCSoftware 2013-04-04 16:24:50

+0

@DCSoftware通過實現'World'接口,您仍然可以擴展'BaseGame'。不知道你的問題是什麼... – 2013-04-04 16:28:40

+0

好吧,我會嘗試更清楚 - 我需要的是能夠創建許多類,擴展BaseGame有獨特的方法,但我需要能夠返回所有類從一種方法 – DCSoftware 2013-04-04 16:51:12

0

我認爲你必須定義返回類型爲超類。然後你的方法可以返回任何從這個超類派生出來的類。

。這被稱作在Java協變返回類型。舉幾個例子:sample1sample2

這裏是一個示例代碼:

class A { 
    int x = 1; 
} 

class B extends A { 
    int x = 2; 
} 

class Base {  
    A getObject() { 
     System.out.println("Base"); 
     return new B(); 
    } 
} 

public class CovariantReturn extends Base { 

    B getObject() { 
     System.out.println("CovariantReturn"); 
     return new B(); 
    } 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     Base test = new CovariantReturn(); 
     System.out.println(test.getObject() instanceof B); 
     System.out.println(test.getObject().x); 
    } 
} 
+0

請把示例代碼在這裏 – 2013-04-04 16:12:32

+0

我很抱歉,但我真的不明白 – DCSoftware 2013-04-04 16:14:21

+0

的鏈接包含的代碼 – 2013-04-04 16:14:54