gpt4 book ai didi

java - 返回扩展类

转载 作者:行者123 更新时间:2023-12-01 14:42:28 25 4
gpt4 key购买 nike

我不确定这是否真的有意义(我有点困惑自己),但我想做的是创建一个迷你游戏插件,并且我试图让它在 map 之间循环,我创建了一个扩展 BaseGame 的新类,我将插件实例、世界名称和 xml 文件名传递给父类(super class) BaseGame,然后 Basegame 类解析来自 xml 文件和设置变量的信息。我在扩展 BaseGame 的类中有一些方法,因为大多数 map 都有不同的游戏类型,所以我需要为不同的事件做不同的事情,例如在 TDM 上我需要阻止玩家破坏这个,所以我想在监听器中执行此操作

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

我面临的问题是从 MapCycler 类返回当前世界,因为所有 map 类都有不同的方法,我需要一种方法以通用方法返回 map 类,该方法可以返回扩展 BaseGame 的所有 map 类,但我仍然需要能够访问扩展 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();
}

因为它是世界上独一无二的。

最佳答案

关键是你需要为你的世界对象定义一个统一的接口(interface)。然后您可以调用相同的方法(在基类/接口(interface)中定义),并且通过多态性,每个子类可以做出不同的 react

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() 时,应该返回一个 World 对象,也就是说,它实现了 World 接口(interface)。每个对象的 react 可能不同,但由于它们都共享接口(interface),因此可以将它们视为相同的对象。

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

关于java - 返回扩展类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15816229/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com