我正在开发一个bukkit插件,并希望创建一个类' User'这就像玩家一样,除了我添加的额外方法。问题是,我必须实现Player,看来我必须添加Player中的所有方法(它是一个接口)。我不想覆盖他们当前的值,但我想添加它们。
感谢。
答案 0 :(得分:2)
接口本质上没有实际的方法来覆盖。如果必须使用implements关键字,则必须编写包含的方法。这就是Java中OOP的工作原理。
但是,如果找到可以扩展的内容,则无需覆盖继承的方法。如果您愿意,可以通过在函数调用中包含super()
来确保它们运行父函数的代码。
答案 1 :(得分:1)
接口没有当前值,因为它是一个接口。
我会说(根据经验)您不想创建自己的Player实现,因为它不符合实际实现并且基本上不可用。
最好有一个“管理”类,它将信息引用到玩家的UUID:
public class PlayerManager {
private Map<UUID, PlayerInfo> info = new HashMap<>();
//methods for getting/removing player info, etc. For example:
public PlayerInfo getPlayerInfo(Player p) {
return this.getPlayerInfo(p.getUniqueId());
}
public PlayerInfo getPlayerInfo(UUID uuid) {
return this.info.get(uuid);
}
}
信息类:
public class PlayerInfo {
private Object someInfo;
public PlayerInfo() {...}
}
您可以在PlayerInfo
课程中存储所需的方法/信息,并从Player#getUniqueId()
的参考文献中获取
这基本上是处理此问题的推荐方法,并且不会在更新之间中断。
答案 2 :(得分:0)
我不明白你的意思&#34;覆盖他们当前的值&#34;。 如果您实现了一个接口,那么根据定义,您声明您的类的行为类似于已实现的类,因此您应该重写其方法。 正在制作&#34; Player&#34;抽象类是一个选项吗?
答案 3 :(得分:0)
你可以扩展CraftPlayer,但是这会破坏每个Bukkit更新,并且涉及到各种其他问题,所以我真的不会推荐这个选项。
您可以将播放器对象存储在变量中,然后在玩家对象变量上使用带有@Delegate注释的lombok(http://projectlombok.org/)。这将在编译时创建类似下面的方法,并且只需要在添加新方法时重新编译。
public String getName(){
return player.getName();
}
答案 4 :(得分:0)
您可以在不实施Player
的情况下执行此操作,只需使用一种方法在您的用户类中获取播放器:
public class User{
private Player player;
public User(Player p){
this.player = p
}
public Player getPlayer(){
return this.player
}
//anything else you want to do
}
因此,当您创建用户User u = new User(player);
时,您只需在用户上调用getPlayer()
即可轻松访问播放器方法。例如,如果您想向用户发送消息hello world
,您可以执行以下操作:
user.getPlayer().sendMessage("hello world");
如果你想将播放器传送到location
位置,你可以这样做:
user.getPlayer().teleport(location);
这就是我为这样的所有课程所做的,对我来说这很好用!
答案 5 :(得分:0)
播放器是CBukkit CraftPlayer的实现,而不是扩展它。 CraftPlayer的实例必须使用您自己的代码而不是CBukkit代码进行管理,除非您想进入ASM,否则不会跳过该步骤。