[英]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.