传递多个类(Class <! - ?extends foo - > Interfaces和Abstract classes)

时间:2015-02-23 05:02:52

标签: java class interface extends

我正在使用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;
    }

}

现在我们终于可以回答我的问题。我宣布变量&#34; champ&#34;然而,作为类型Class,每当我想从MasterYi类调用getID()的抽象方法时,当我写&#34; champ。&#34;时,该选项不会出现在下拉列表中。那么我该如何制作变量&#34; champ&#34;能够访问所有抽象和接口方法,无论我发送什么字符类?

感谢您通过这篇长篇文章与我合作,感谢您的任何见解或建议! :)

1 个答案:

答案 0 :(得分:2)

由于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();
}

获得这个名字仍然有效!