[英]Passing multiple classes ( Class<? extends foo> Interfaces and Abstract classes)
我正在使用Bukkit API為Minecraft開發英雄聯盟插件。 無論如何,這個問題是普遍的。 由於《英雄聯盟》中有許多不同的角色,因此無法確定玩家會選擇哪個角色。 那么,如何在世界范圍內創建一個可以解釋這一問題的變量?
因此,我創建了所有字符類都將實現的基本接口:
public interface ChampInterface {
void setUp(Core plugin);
String getName();
ItemStack getItem();
void add(String name);
int getID();
}
接下來,我有一個實現ChampInterface的抽象類:
public abstract class ChampTemplate implements ChampInterface{
private String name;
private int ID;
public String getName(){
return name;
}
public int getID(){
return ID;
}
}
最后,將創建所有字符來擴展抽象類,如下所示:
public class MasterYi extends ChampTemplate{
Core plugin;
private String name;
private static List<String> players = new ArrayList<String>();
public MasterYi(String name){
this.name = name;
}
@Override
public void setUp(Core plugin) {
this.plugin = plugin;
}
@Override
public String getName() {
return "Master Yi";
}
@Override
public ItemStack getItem() {
return new ItemStack(Material.WOOD_SWORD);
}
@Override
public void add(String name) {
players.add(name);
}
}
(忽略Core插件)
現在,每次玩家加入游戲時,都會生成一個PlayerInfo類,用於存儲所有統計信息。 因此,一旦玩家選擇了角色,就必須將該類傳遞給玩家的PlayerInfo實例(為簡化起見,我將傳遞的類放在構造函數中):
public class PlayerInfo {
private Class<? extends ChampTemplate> champ;
private String name;
public PlayerInfo(String name, Class<? extends ChampTemplate> c){
this.champ = c;
this.name = name;
}
public String getName(){
//somehow say champ.getName() and it would reference the appropriate class
return null;
}
}
現在我們終於可以回答我的問題了。 我已經將變量“ champ”聲明為Class類型,但是,每當我想從MasterYi類調用getID()的抽象方法時,當我編寫“ champ”時,該選項就不會出現在下拉列表中。 那么,無論我發送什么字符類,如何使變量“ champ”能夠訪問所有抽象方法和接口方法?
感謝您通過這篇漫長的帖子與我保持聯系,並感謝您提供任何見識或建議! :)
由於MasterYi
擴展了ChampTemplate
,因此可以替代它。 意味着您不必檢查它是否擴展了它。
private ChampTemplate champ;
public PlayerInfo(String name, ChampTemplate champ){
this.champ = champ;
}
public String getName(){
return champ.getName();
}
然后,當您要制作PlayerInfo
對象時,可以傳入MasterYi
對象。
MasterYi my = new MasterYi("Test");
PlayerInfo pi = new PlayerInfo("Bob", my);
您可以從MasterYi
對象獲得冠軍的名字,因為它被覆蓋了。
pi.getName(); //Returns "Master Yi"
因此,實際上,您無需檢查任何內容。 只需存儲一個ChampTemplate
並傳入任何擴展它的對象即可。
編輯:使用接口是什么。 無需創建接口,而是讓抽象類實現該接口,然后讓另一個類最終擴展該接口,您只需將接口實現到您的主類中即可。
public interface IChampion {
void setUp(Core plugin);
String getName();
ItemStack getItem();
void add(String name);
int getID();
}
然后讓您的MasterYi
(或您添加的任何其他冠軍)實現該接口。
public class MasterYi implements IChampion{
Core plugin;
private String name;
private static List<String> players = new ArrayList<String>();
public MasterYi(String name){
this.name = name;
}
public void setUp(Core plugin) {
this.plugin = plugin;
}
public String getName() {
return "Master Yi";
}
public ItemStack getItem() {
return new ItemStack(Material.WOOD_SWORD);
}
public void add(String name) {
players.add(name);
}
}
現在您沒有抽象類了!
要使用上面的修復程序,只需將所有ChampTemplate
替換為您的界面。
private IChampion champ;
public PlayerInfo(String name, IChampion champ){
this.champ = champ;
}
public String getName(){
return champ.getName();
}
而且獲得名稱仍然有效!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.