我想要一个像这样的抽象类:
public abstract Operator {
public int[] operands;
public Operator(int[] operands) {
this.operands = operands;
}
public abstract int getOperatorResult();
}
还有一些运算符可以从它扩展,例如:
public class Add extends Operator {
public Add(int[] operands) {
super(operands);
}
public int getOperatorResult() {
return operands[0] + operands[1];
}
}
还有一个 OperatorCreator,它获取类似“1+1”的表达式并返回适当的 Operator 的子类(在本例中为 Add):
public class OperatorCreator {
public static Operator getInstance(String expr) {
...
}
}
主要问题: 而且我想让其他人通过扩展 Operator 类来设计自己的运算符。并以多态方式使用它们的运算符。像这样:
public class Main {
public static void main(String[] args) {
Operator op = OperatorCreator.getInstance("1-2");
System.out.println(op.getOperatorResult());
}
}
我该怎么做?
编辑: 我知道可以使用反射。但如果可能的话,我宁愿不使用反射。而且我知道我可以让 Operator 的子类的设计者使用在运行时调用方法来注册她的新类。但我不想使用这种方法。
谢谢!
最佳答案
基本上你问的是如何实现一个框架;在某种意义上:
如果其他方可以提供实现运算符的类;要点是:您需要一个中央实例来了解哪个类为哪个运算符提供实现。
因此,一种解决方案是,“实现者”必须提供类似“getOperator()”的方法……然后返回“-”或“+”或其他任何内容。
如果类文件实现了您的接口(interface),您就可以使用反射来“扫描”类文件;如果是这样;您可以调用“getOperator()”来了解哪个类提供了哪个实现。稍后,您的 OperationCreator 可以使用该知识来实例化解析“1-2”所需的那些类的对象。
我更喜欢避免使用反射的方法。相反,“实现者”应该能够调用一些方法,例如“OperationCreator.registerOperationProvider()”。含义:首先,你告诉OperationCreator对象XYZ可以处理“-”;然后 OperationCreator 稍后可以将对“-”的调用分派(dispatch)给 XYZ。
关于java - 设计一个抽象类,以便任何人都可以扩展它并以多态方式使用扩展类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31699929/