嘿,我有 common
包含以下代码和两个附加模块的模块 bungee
以及 bukkit
. 我需要如何构造代码以便使用 common
每个模块中的部分代码,但不必强制转换 Object
在 ChildCommand
至 CommandSender
,有没有办法真正得到正确的答案 CommandSender
那里而不是 Object
?
需要记住的一些事情: common
模块没有依赖项。 bungee
模块使用bungeecordapi和 common
作为依赖项的模块。 bukkit
模块使用bukkitapi和 common
作为依赖项的模块。
bukkit和bungeecordapi都有自己的特性 CommandSender
但是他们不一样。
不能修改来自API的类。
这些课程是 common
模块。
public interface ChildCommand {
void run(Object sender, String[] args);
String getName();
}
public abstract class AbstractCommandService<S> {
protected final Set<ChildCommand> childCommands;
protected AbstractCommandService() {
childCommands = new HashMap<>();
}
public boolean execute(Object sender, String commandName, String[] args) {
for (ChildCommand childCommand : childCommands) {
if (childCommand.getName().equalsIgnoreCase(commandName)) {
childCommand.run(sender, args);
return true;
}
}
return false;
}
public void addCommand(ChildCommand command) {
childCommands.add(command);
}
}
这些课程是 bungee
模块。
public class BungeeReload implements ChildCommand {
private final String NAME = "reload";
public BungeeReload() {}
@Override
public String getName() {
return NAME;
}
/*how do I structure my code so here I would get `net.md_5.bungee.api.CommandSender`
instead of `Object` for the sender parameter.*/
@Override
public void run(Object sender, String[] args) {
((CommandSender)sender).sendMessage("Reload command has been ran on bungee.");
}
}
public class BungeeCommandService extends AbstractCommandService<CommandSender> {}
public class MainBungeeCommand extends Command {
private BungeeCommandService commandService;
public MainBungeeCommand() {
super("cmd-name", "cmd-permission", "cmd-alias");
commandService = new BungeeCommandService();
commandService.addCommand(new BungeeReload());
}
@Override
public void execute(CommandSender sender, String[] args) {
if (args.length > 0) {
String commandName = args[0];
boolean successfullyExecuted = commandService.execute(sender, commandName, args);
if (!successfullyExecuted) sender.sendMessage("Unknown command!"));
}
}
}
这些课程是 bukkit
模块。
public class BukkitReload implements ChildCommand {
private final String NAME = "reload";
public BukkitReload () {}
@Override
public String getName() {
return NAME;
}
/*how do I structure my code so here I would get `org.bukkit.command.CommandSender`
instead of `Object` for the sender parameter.*/
@Override
public void run(Object sender, String[] args) {
((CommandSender)sender).sendMessage("Reload command has been ran on bukkit.");
}
}
public class BukkitCommandService extends AbstractCommandService<CommandSender> {}
public class MainBukkitCommand implements CommandExecutor {
private BukkitCommandService commandService;
public MainBukkitCommand() {
commandService = new BukkitCommandService();
commandService.addCommand(new BukkitReload());
}
@Override
public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
if (args.length > 0) {
String commandName = args[0];
boolean successfullyExecuted = commandService.execute(sender, commandName, args);
if (!successfullyExecuted) sender.sendMessage("Unknown command!"));
return true;
}
return false;
}
}
这里是API中的类。
bungeecordapi中的commandsender类。
来自bungeecordapi的命令类。
bukkitapi的commandsender类。
bukkitapi中的commandexecutor类。
暂无答案!
目前还没有任何答案,快来回答吧!