假设我想要一个像这样的抽象类:
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 对象。因此任何运算符的子类都可以有一个静态方法:“getSymbol”,它返回运算符的符号。但有一个问题。如果有人扩展 Operator 并且不提供“static getSymbol”,她的代码将成功编译,而无需为 OperatorCreator 提供了解其新 Operator 子类的符号的机制,这会导致运行时问题。我不想让 getSymbol 成为 Operator 的抽象方法来强制子类实现它,因为我不想创建子类的实例来获取它的符号。如何强制子类在加载时注册其符号?
最佳答案
您可以扩展 Operator
类层次结构,使其具有每个符号类型的抽象子类,例如 AddOperator
、SubtractOperator
、乘法运算符
。现在,客户端通过选择要扩展的父类(super class)来为您提供运算符的类型。
关于java - 强制子类在加载时执行某些操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31771263/