如何使用功能F创建课程A
,B
,C
,然后将课程D
添加到bin/
并获得不同功能比F而不以任何方式修改A
,B
或C
?
我已经在ModLoader为Minecraft看到了这一点。使用ModLoader,您可以将类从ModLoader复制到Minecraft。然后,您可以简单地将以“mod_”开头的新类放入Minecraft jar中,并为游戏添加新内容。在任何时候都没有任何类直接引用你的“mod_Foobar”类。
一个小的工作示例,以及任何进一步阅读的链接都是可取的。
答案 0 :(得分:2)
public class Reflection {
public void sayHello(String theClass){
//Since Mod classes are in package 'mod', we precede their name accordingly.
Class aClass = Class.forName("mod." + theClass);
aClass.getMethod("sayHi").invoke(aClass.newInstance());
}
public static void main(String[] args) {
//Get a list of the compiled classes in the 'mod' folder
String path = "./bin/mod";
String fileName;
File folder = new File(path);
List<File> fileList = Arrays.asList(folder.listFiles());
//Iterate through the list of classes to invoke their methods
Iterator<File> it = fileList.iterator();
while(it.hasNext()){
fileName = it.next().getName();
//When invoking the sayHello method, we remove the file extension
new Reflection().sayHello(fileName.replace(".class", ""));
}
}
}
Class ModA:
public class ModA {
public void sayHi(){
System.out.println("Hi! I'm ModA.");
}
}
Class ModB:
public class ModB {
public void sayHi(){
System.out.println("Hi! I'm ModB.");
}
}
请注意:
答案 1 :(得分:0)
类路径用于加载类并且它是有序的,因此如果您将类放在原始类之前,那么将加载您的类而不是原始类。
答案 2 :(得分:0)
我想这都是关于应用基本的OO原则。
简单继承允许您实现polymorphisme。在设计良好的系统中,这是将新行为引入系统的良好起点。
strategy pattern是工具箱中的另一种软件设计模式,可以在运行时选择算法的行为。
factory pattern(结合上面提到的反射和模式)可以创建一个系统,您可以将类“删除”到现有系统中,以便在不更改其核心的情况下添加新功能。
您还可以classpath scanning在启动时查找有趣的(带注释的)类来修改运行时行为。
我确信MindCraft是一个设计良好的系统,它应用了比这里描述的模式更多的模式。
最终,这一切都归结为良好的设计,并在正确的位置应用正确的模式。