一般而言,我对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();
希望能帮助到你。