[英]Returning an extended class
我不确定这是否真的有意义(我有点困惑我自己),但是我想做的是创建一个迷你游戏插件,我试图使其在地图之间循环,所以我创建了一个扩展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();
}
因为它是世界上独一无二的。
它们的关键是您需要为您的世界对象定义一个统一的接口。 然后,您可以调用相同的方法(在基类/接口中定义),并且通过多态性,每个子类可以做出不同的反应
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")
}
}
现在,当您调用应该返回World
对象的plugin.mapCycler.getCurrentWorld()
,即实现了World
接口。 每个对象可以做出不同的反应,但是由于它们都共享接口,因此可以将它们视为相同。
plugin.mapCycler.getCurrentWorld().onBreakEvent(event);
我认为您必须将return-type定义为超类。 然后,您的方法可以返回从该超类派生的任何类。
在Java中,这称为协变返回类型 。 几个例子: sample1 , sample2
这是一个示例代码:
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);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.