【问题标题】:How to initialize a specific subclass in a loop?如何在循环中初始化特定的子类?
【发布时间】:2018-08-04 01:49:22
【问题描述】:

我有一个名为 Operator 的类,它有多个子类,每个子类都有一个标识它的变量。我在另一个类中有一个方法,它根据变量返回运算符子类之一的新实例,我想知道是否有优化的方法来初始化和返回案例的特定子类依赖项。

算子类

public abstract class Operator {
private String logic;
private String formula;

public Operador(String logic, String formula) {
    this.logic = logic;
    this.formula = formula;
}
//Some methods
}   

一些子类

连词类

public class Conjuncion extends Operador {

public Conjuncion() {
    super("and", "&");
}
//Some methods
}

析取类

public class Disjunction extends Operador{

public Disjunction() {
    super("or", "@");
}
//Some methods
}

在另一个类中,我有一个名为 selectOperator 的方法,如果满足某些条件,它会返回 Operator 的子类之一

private Operator selectOperator(String str) {
    Operator operator = null;
    switch (str) {
    case "&":
        operator = new Conjuncion();
        break;
    case "@":
        operator = new Disjunction();
        break;
    case "-":
        operator = new Negacion();
        break;
    //More cases
    }
    return operator;
}

我的问题是我可以有这样的东西吗?

for(int = i; i < numberOfSubclasses; i++){
        if(str.equals(subclass.getLogic)) {
            return Operator operator = new SubClass();
        }
    }

我是 OOP 的新手,所以这对新手来说可能会有很大帮助,如果您对我的代码中的其他任何内容有其他建议,它也会有所帮助。

顺便说一句,如果有任何变量或类名不匹配,那是因为我的代码是西班牙语,我为问题翻译了它。

【问题讨论】:

  • 实际上,是的,您可以。您所要求的是 algebraic data type,或者在 OO 世界中,object algebralink.springer.com/chapter/10.1007%2F978-3-642-31057-7_2 。典型 OO 实践中的另一种选择是访问者模式。你可以看看两者。
  • 虽然我不得不说,代数数据类型是一种与典型 OO 思维方式背道而驰的概念,而且很多 OO 程序员经常会告诉你不要这样做。
  • 如果明确定义了子类的数量,使用枚举可能是个好主意。
  • 所有算子都实现相同的方法吗?它们有任何可变状态吗?
  • 我希望以后可以添加更多的子类,所以我不知道。

标签: java class oop inheritance polymorphism


【解决方案1】:

据我了解,您希望摆脱所有开关情况,因此使用处理这种情况的 for 循环,通过检查什么是 operator.getLogic() 并使用它来传递正确的子类。

所以如果我的假设是正确的,你不能像你现在的类和构造函数那样检查它。 您可以做的是创建一个包含您使用的所有运算符的列表,并为该列表中的每个对象获取其逻辑:

ArrayList<Operators> operators_list = new ArrayList<Operators>();
//put all of your operators inside that list

使用 for 循环,例如:

for(int i=0; i<operators_list.size(); i++) {

     if(str.equals(operators_list.get(i).getLogic() {
     //create the subclass according to what the value of the current
     //getLogic() is, and call that as a super()
     }
}

但对您的问题的快速回答是

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-26
    • 1970-01-01
    • 2021-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多