2013-04-04 78 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