所以情况就是这样:我正在创建一个多人游戏,我希望我的朋友……,能够为它创建机器人.所以我要做的是创建一个抽象类Bot {},并为机器人定义函数,然后他们必须实现它们:非常简单.
我被卡住了,之后如何添加它们?您可以使用反射或类似的东西来找到Bot的所有继承者吗?或者我是否需要搜索.jar文件?
到目前为止,这是我如何做到的(简化,类不在同一个文件中等):
abstract class Bot{
public int play();
//...
}
class Bot1 extends Bot{
@override
public int play(){/*do stuff*/}
//...
}
然后当我需要每个机器人之一:
ArrayList bots = new ArrayList<>();
bots.add(new Bot1());
//...
我的问题是,如果我要使用它,因为Bot1 instanciation是硬编码的,我需要允许人们修改我的代码来添加他们自己的机器人 – 我不想要.
我的问题是,如果不进行硬编码,我怎样才能做到这一点?我知道这是可能的,因为Minecraft做到了(mods等),但我不知道如何做到这一点.到目前为止,我的研究没有给我任何结果(可能是因为我不知道如何用一个简单的句子解释这个…),所以欢迎任何提示的线索,以及学习如何做到这一点的地方.
另外,我对OOP有很好的理解,但是我对于反射和getClass()事情都是新手……
解决方法:
最简单的方法(没有任何外部框架)可能是将Bot定义为接口(SPI,服务提供者接口),然后使用JRE附带的内置Service Loader机制.然后需要部署自定义Bot实现(作为JAR),以便可以在应用程序的类路径中访问它们.
所以,像:
SPI合约:
public interface Bot {
int play();
}
实现(这需要打包到一个JAR中,该JAR具有链接文档中指定的目录结构,包括META-INF文件夹):
public class MyBot implements Bot {
@Override
public int play() {
// do something
}
}
抬头:
import java.util.ServiceLoader;
public class BotResolver {
private final ServiceLoader loader;
public BotResolver() {
loader = ServiceLoader.load(Bot.class);
}
/**
* Gets all bot implementations that are currently available in the classpath.
*/
public List getAllBots() {
List allBots = new ArrayList<>();
Iterator it = loader.iterator();
while (it.hasNext()) {
allBots.add(it.next());
}
return allBots;
}
}
标签:java,oop,inheritance
来源: https://codeday.me/bug/20190722/1501680.html