Как реализовать интерфейс, если поле реализует этот интерфейс - PullRequest
0 голосов
/ 03 декабря 2018
public interface Function {

    double apply(double arg);

    Function derivative();

    String toString();

}

public interface Integrable extends Function {

    Function integrate();

}

public class Sum implements Function {

    private Function func1, func2;

    public Sum(Function func1, Function func2) {
        this.func1 = func1;
        this.func2 = func2;
    }

    @Override
    public double apply(double arg) {
        return func1.apply(arg) + func2.apply(arg);
    }

    @Override
    public Function derivative() {
        return new Sum(func1.derivative(), func2.derivative());
    }

    @Override
    public String toString() {
        return func1.toString() + " + " + func2.toString();
    }

    @Override
    public Function integrate() {
        //TODO only allow if (this instanceof Integrable)
        try {
            return new Sum(((Integrable) func1).integrate(), ((Integrable) func2).integrate());
        } catch (ClassCastException e) {
            throw new RuntimeException("could not call integrate on one of the functions of this sum, as it is not of type Integrable");
        }
    }

}

Я пытаюсь создать класс Sum выше, но он должен иметь тип Integrable, если обе функции также Integrable.В противном случае это просто должно быть Function.

. Есть ли способ сделать это эффективно, или лучше сделать его Integrable по умолчанию и проверить 2 поля в integrate()?

Ответы [ 2 ]

0 голосов
/ 03 декабря 2018

Я бы предложил вам создать классы адаптеров, которые реализуют интерфейс Integrable, предоставить реализации по умолчанию для соответствующих абстрактных методов по вашему выбору.Но я не думаю, что вы можете создать класс в Java на основе условий, так как классы, созданные в Java, являются прямыми, я имею в виду, что вы должны знать, что представляет собой ваш класс перед созданием.

0 голосов
/ 03 декабря 2018

Я бы сказал, что параметр Sum должен принимать Integrable в этом случае.

Вы можете создать два класса - Sum и IntegrableSum (э-э ... нужно лучшеимя)

class Sum implements Function {
    public Sum(Function func1, Function func2) {
       ....
    }
}

class IntegrableSum implements Integrable {
    public IntegrableSum(Integrable integrable1, Integrable integrable2) {
       ....
    }
}
...