簡體   English   中英

使用自定義方法和其他類的方法創建類? 爪哇

[英]Create class with custom methods and methods from other class? Java

我正在開發bukkit插件,並希望創建一個類似於Player的類“ User”,但要添加額外的方法。 問題是,我必須實現Player,並且看來我必須從Player添加所有方法(它是一個接口)。 我不想覆蓋它們的當前值,但是,我想添加到它們。

謝謝。

接口本質上沒有實際的方法可以覆蓋。 如果必須使用Implements關鍵字,則必須編寫包含的方法。 這就是Java中的OOP的工作方式。

但是,如果找到可以擴展的內容,則無需覆蓋繼承的方法。 而且,如果願意,可以通過在函數調用中包含super()來確保它們運行父函數的代碼。

該接口沒有當前值,因為它是一個接口。

我會(根據經驗)說,您不想創建自己的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()的引用中獲取它。

本質上,這是處理此問題的推薦方法,並且不會在兩次更新之間中斷。

我不明白您的意思是“覆蓋其當前值”。 如果實現接口,則根據定義,您聲明您的類的行為類似於已實現的類,因此您應覆蓋其方法。 將“ Player”作為抽象類是一種選擇嗎?

您可以擴展CraftPlayer,但是這將在每次Bukkit更新時中斷,並且涉及其他各種問題,因此我真的不建議使用此選項。

您可以將播放器對象存儲在一個變量中,然后在播放器對象變量上使用帶有@Delegate批注的lombok( http://projectlombok.org/ )。 這將在編譯時創建如下所示的方法,並且僅在添加新方法時才需要重新編譯。

public String getName(){
    return player.getName();
}

您可以在不實現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);

這是我在所有此類課程中所做的,對我來說效果很好!

Player是CBukkit CraftPlayer的實現,而是對其進行擴展。 必須從您自己的代碼而不是從CBukkit代碼管理CraftPlayer實例,除非您想進入ASM,否則不要跳過該步驟。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM