一般而言,我对Java或oop并没有太多的实践经验,所以现在我遇到了一个可能很容易解决的问题,但是我根本不确定如何以一种优雅的面向oop的解决方案可能看起来像。

因此,这是一个简化的摘要:

假设我想编写某种计算应用程序,其中首先包含以下几种方法:

static double sine(double x){...}
static double cosine(double x){...}


等等。
然后,某些其他静态方法将执行涉及这些函数之一的导数的某种计算。如果我们假装没有办法近似该导数,那么我想到的最简单的解决方案是将上述每个方法包装在一个类中,并让这些类实现“可区分”接口
定义了方法'evaluateDerivative',例如:

interface Differentiable {
    double evaluateDerivative(double x);
}

class sine implements Differentiable {
    static double evaluate(double x){
        return...;
    }

    public double evaluateDerivative(double x) {
        return cosine.evaluate(x);
    }
}


因此,如果需要任何方法的派生进行另一次计算,我可以简单地执行以下操作:

static double returnDerivativePlusOne(Differentiable d, double x){
    return d.evaluateDerivative(x) + 1;
}


好的,现在的问题是这样的:当我实际上要调用上面的方法时,我需要一个正弦类的实例,例如:

DerivativePlusOne(new sine(), 1);


这实际上没有任何意义,因为正弦类仅包含静态方法(可能还包含一些最终字段),因此创建对象对我来说似乎很奇怪。

因此,是否有其他方法可以更优雅地产生相同的结果?任何帮助,将不胜感激。

最佳答案

为什么不将evaluateDerivative函数也设为静态。不需要接口。

要利用多态性,我们可以执行以下操作。假设我们正在执行以下操作:我们有两个Sine和Cosine类,以及一个Differentiable接口。

interface Differentiable {
    double evaluateDerivative(double x);
}

class Sine implements Differentiable {
    static double evaluate(double x){return...}
    public double evaluateDerivative(double x) {return somevalue;}
}

class Cosine implements Differentiable {
    static double evaluate(double x){return...}
    public double evaluateDerivative(double x) {return somevalue;}
}


在这种情况下,要利用多态性,您可以做的是:

Differentiable d = new Sine();
double derivative = d.evaluateDerivate();
d = new Cosine();
derivative = d.evaluateDerivate();


希望能帮助到你。

08-17 14:17