我正在使用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;能够访问所有抽象和接口方法,无论我发送什么字符类?
感谢您通过这篇长篇文章与我合作,感谢您的任何见解或建议! :)
答案 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();
}
获得这个名字仍然有效!