使用另一个类的自定义方法和方法创建类? Java的

时间:2014-04-23 18:04:14

标签: java bukkit

我正在开发一个bukkit插件,并希望创建一个类' User'这就像玩家一样,除了我添加的额外方法。问题是,我必须实现Player,看来我必须添加Player中的所有方法(它是一个接口)。我不想覆盖他们当前的值,但我想添加它们。

感谢。

6 个答案:

答案 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,否则不会跳过该步骤。