gpt4 book ai didi

java - 传递多个类( Class 接口(interface)和抽象类)

转载 作者:行者123 更新时间:2023-11-30 03:32:38 24 4
gpt4 key购买 nike

我正在使用 Bukkit API 为 Minecraft 开发英雄联盟插件。无论如何,这个问题是普遍存在的。由于《英雄联盟》中有如此多不同的角色,因此无法确定玩家会选择哪一个。那么我到底如何创建一个可以解释这一点的变量呢?

所以我创建了所有角色类都将实现的基本接口(interface):

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);
}

}

(忽略核心插件)

现在,每次玩家加入游戏时,都会生成一个 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”无论我发送什么字符类都能够访问所有抽象方法和接口(interface)方法呢?

感谢您耐心看完这篇长文,也感谢您提供任何见解或建议! :)

最佳答案

由于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 并传入扩展它的任何对象即可。

编辑:使用接口(interface)本身。您可以将接口(interface)实现到主类中,而不是创建一个接口(interface),然后让一个抽象类实现该接口(interface),然后让另一个类最终扩展该接口(interface)。

public interface IChampion {

void setUp(Core plugin);

String getName();

ItemStack getItem();

void add(String name);

int getID();

}

然后让您的MasterYi(或您添加的任何其他冠军)实现该接口(interface)。

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

获取名称仍然有效!

关于java - 传递多个类( Class<? extends foo> 接口(interface)和抽象类),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28667190/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com