java - 设计一个抽象类,以便任何人都可以扩展它并以多态方式使用扩展类

标签 java inheritance design-patterns

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

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/

相关文章:

java - 在可以避免的情况下需要在迭代时手动同步 Synchronized 列表吗?

design-patterns - 使用 Java 8 的装饰器模式

c# - 一次性对象 : yea or nay?

java - 最终变量首先初始化

java - Feign请求拦截器动态值

java - 如何在 java 中将 Progression 类重新设计为抽象和通用的?

c++ - 在多级继承中从中间类调用派生类函数而不将其标记为虚拟

Java保护变量可以在同一个包内访问而不需要继承如何?

c# - 重构为子类

java - 设计模式中的参与者模式?