簡體   English   中英

通過多個班級(班級 <? extends foo> 接口和抽象類)

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

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