假设我想要一个这样的抽象类:
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());
}
}
假设OperatorCreator知道Operator的子类的.class文件位于何处,并使用反射在运行时加载这些子类。 但是,OperatorCreator必须知道一件事:例如,当给出“1 + 1”时,它还必须知道这些子类的运算符符号以返回Add对象。所以任何Operator的子类都可以有一个静态方法:“getSymbol”返回运算符的符号。但有一个问题。如果某人扩展了Operator并且没有提供“静态getSymbol”,那么她的代码将成功编译,而不会为OperatorCreator提供一个机制来知道她的新Operator的子类的符号,并且它会导致运行时问题。而且我不想让getSymbol成为一个运算符的抽象方法来强制子类来实现它,因为我不想创建一个子类的实例来获取它的符号。如何强制子类在加载符号时注册它们?
答案 0 :(得分:-1)
您可以扩展Operator
类层次结构,使其具有每种符号类型的抽象子类,例如AddOperator
,SubtractOperator
,MultiplyOperator
。现在,客户端通过选择要扩展的超类来为您提供运算符的类型。