Как определить несколько приемлемых типов классов для параметра метода? - PullRequest
0 голосов
/ 19 апреля 2019

как домашнее задание, меня попросили построить какой-нибудь калькулятор с Java. Чтобы упростить создание выражений, я хочу добавить конструкторы, предоставляющие «ярлыки» для создания классов Num и Var. Например, вместо того, чтобы писать новый Plus (новый Var ("x"), новый Num (5)), я хотел бы иметь возможность написать новый Plus ("x", 5) и получить то же результирующее выражение. чтобы не повторять строки кода, я создал абстрактный класс с именем BinaryExpression, внутри него находятся все возможные комбинации, которые мне нужны для моих конструкторов. Я пытаюсь найти элегантный способ создания класса плюс без необходимости переписывать тот же код снова.

public abstract class BinaryExpression implements Expression {

    protected Expression x;
    protected Expression y;

    public BinaryExpression(Expression x, Expression y) {
        this.x = x;
        this.y = y;
    }
    public BinaryExpression(String x, Expression y) {
        this(new Var(x),y);
    }
    public BinaryExpression(Double x, Expression y) {
        this(new Num(x), y);
    }
    public BinaryExpression(Expression x, String y) {
        this(x ,new Var(y));
    }
    public BinaryExpression(Expression x, Double y) {
        this(x ,new Num(y));
    }
    public BinaryExpression(String x, String y) {
        this(new Var(x) ,new Var(y));
    }
    public BinaryExpression(Double x, Double y) {
        this(new Num(x) ,new Num(y));
    }
    public BinaryExpression(Double x ,String y){
        this(new Num(x) ,new Var(y));
    }
    public BinaryExpression(String x ,Double y){
        this(new String(x) ,new Num(y));
    }

Я искал решение, подобное этому:

public class Plus extends BinaryExpression {
    public Plus(<String,Double, Expression> x, <String,Double, Expression> y) {
        super(x, y);
   }

поэтому я принимаю типы этого класса только так, чтобы они соответствовали своему назначенному конструктору в классе BinaryExpression. спасибо:)

1 Ответ

1 голос
/ 19 апреля 2019

Проблема в том, что вам нужен какой-то общий контейнер для объектов, который можно обрабатывать так, как если бы они были экземплярами Expression, но на самом деле они не являются экземплярами Expression.
(пример: String, Double)

Этот ответ предполагает следующее:

class Num implements Expression
class Var implements Expression

и что существует следующий конструктор или что не определен конструктор для класса Expression

public Expression() {}

Я думаю, что хорошим решением будеткак предложено @markspace.Вы можете убедиться, что он компилируется с помощью instanceof, чтобы определить, к чему приводить аргументы.

public Plus(Object a, Object b) {
    Expression exprA = convertToExpression(a);
    Expression exprB = convertToExpression(b);
    if(exprA == null || exprB == null) {
        // could error handle here or in the place below
    }
    // do initialization here
}
//
public Expression convertToExpression(Object obj) {
    Expression exprObj = null;
    if(obj instanceof String) {
        exprObj = new Var(obj);
    } else if(obj instanceof Double) {
        exprObj = new Num(obj);
    } else {
        // error handle here or in the place above
    }
    return exprObj;
}

Кроме того, является ли последний конструктор неверным в вашем коде выше?Кажется, это должно читаться так:

public BinaryExpression(String x, Double y) {
    this(new Var(x), new Num(y));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...