繁体   English   中英

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

[英]design an abstract class so that any one can extend it and use the extended class polymorphically

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

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());
    }
}

我怎样才能做到这一点?

编辑:我知道可以使用反射。 但如果可能的话,我宁愿不使用反射。 而且我知道我可以让运算符子类的设计者在运行时调用一个方法来注册她的新类。 但我不想使用这种方法。

谢谢!

基本上你是在问如何实现一个框架; 在以下意义上:

如果其他方可以提供实施运营商的类别; 重点是:您需要一个中心实例,该实例了解哪个类为哪个运算符提供实现。

因此,一个解决方案是“实现者”必须提供类似“getOperator()”的方法......然后返回“ - ”或“+”或其他任何方法。

然后,如果类文件实现了您的接口,则可以使用反射来“扫描”类文件; 如果是这样; 你可以调用“getOperator()”来了解哪个类提供了哪个实现。 稍后,您的OperationCreator可以使用该知识来实例化那些解析“1-2”所需的类的对象。

我更喜欢一种避免使用反射的方法。 相反,“实现者”应该能够调用某些方法,如“OperationCreator.registerOperationProvider()”。 含义:首先,告诉OperationCreator XYZ可以处理对象“ - ”; 然后,OperationCreator可以稍后向XYZ发送“ - ”调用。

如果问题的主要问题是如何在运行时获取实现:这就是ServiceLoader类的用途。 然后,实现者只需实现抽象类,并放置一个类似的文件

 META-INF/services/your.packagename.Operator

进入他们的META-INF文件夹。 在此文件中,他们可以列出他们的实现:

 their.packagename.MinusOperator
 their.packagename.MultiplyOperator

当他们的代码在应用程序的类路径中可见时(例如,当它被打包到添加到类路径的JAR文件中时),那么您可以使用ServiceLoader轻松列出Operator类的所有实现。 ServiceLoaderJavaDoc包含一个精心设计的示例,说明如何完成此操作,因此我将在此省略其他示例代码(这非常简单)。


如果问题的主要内容是如何使用这些实现,请参考它们可能需要的事实,例如getOperatorChar()返回-* ,或更广泛地说:如何创建自动实例化这些实现的解析器课程,然后它应该改写一点......

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM