gpt4 book ai didi

java - 强制子类在加载时执行某些操作

转载 作者:行者123 更新时间:2023-12-01 06:12:45 25 4
gpt4 key购买 nike

假设我想要一个像这样的抽象类:

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 类层次结构,使其具有每个符号类型的抽象子类,例如 AddOperatorSubtractOperator乘法运算符。现在,客户端通过选择要扩展的父类(super class)来为您提供运算符的类型。

关于java - 强制子类在加载时执行某些操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31771263/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com