我对java或oop一般都没有很多实际经验,所以现在我遇到了一个问题,可能很容易解决,但我根本不确定如何优雅,面向oop的解决方案可能看起来像。
所以这是一个简化的纲要:
说我想写一些计算应用程序,首先包含几个方法,如:
static double sine(double x){...}
static double cosine(double x){...}
等等。 然后,一些其他静态方法将执行某种涉及这些函数之一的导数的计算。如果我们假装没有办法近似那个衍生物,那么我想到的最简单的解决方案是将上面的每个方法都包装在一个类中,并让这些类实现一个接口'Differentiable' 定义方法'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);
这没有用,因为正弦类只包含静态方法(也许还有一些最终字段)所以创建一个对象对我来说似乎很奇怪。
那么,是否有一种不同的方法能够以更优雅的方式产生相同的结果?任何帮助将不胜感激。
答案 0 :(得分:3)
为什么不将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();
希望它有所帮助。
答案 1 :(得分:0)
为什么你希望这些方法是静态的?如果没有特别的原因,也许你的应用程序应该只是在启动时创建一个计算类的实例,然后使用它?
在我看来,如果你真的坚持创建提供典型函数的对象并且你想要拥有这些函数的衍生物,你可以手工编写那些派生方法(在另一个甚至是同一个类中)。我实际上无法看到你在这种情况下使用多态的地方,因为这不是一个典型的应用程序(因为你的对象只是计算方法的束)。
更重要的是,如果你真的想创建派生类来计算导数,你的evaluateDerivative
方法应该返回派生类的一个对象,而不是一个数字。
在我看来,在这种情况下,优雅的解决方案是创建一个包含所需方法的库。只是一个易于使用的方法包,因为您的类似乎不提供任何更多的计算方法(典型的数学函数,也已经编写了函数)。我仍然说创建的bundle(甚至可能是一个静态类)履行单一责任原则(因为它只提供一些数学函数),但即便如此,这似乎也不是那么重要。创建优雅的OO解决方案(例如SOLID规则)的规则可以帮助您编写更易于管理且易于构建的代码。我无法看到你如何根据你的计算类建立一个更大的类层次结构,所以最简单的解决方案可能是最好的。