我正在制作一个名为标量
的数据结构。该接口(interface)声明了可用的操作(如乘法/除法/加法/减法)。无论如何,我有 3 个不同的类来实现标量。由分子和分母表示的 FractionalScalar
以及由字符串表示的 GeneralScalar
。
通常我会向Scalar
接口(interface)添加一个访问器,例如double get()
。
所以我可以做类似的事情
public class FractionalScalar implements Scalar
{
public Scalar multiply(Scalar other)
{
return new FractionalScalar(this.get() * other.get());
}
.... // other methods
}
但这仅适用于 FractionalScalar 可以用 double 表示。 “GeneralScalar”不能用数值表示,因为它应该是理论值。不确定理论是最好的词,但这就是我的意思。
Scalar a = GeneralScalar('a');
Scalar b = GeneralScalar('b');
Scalar one = SimpleScalar(1);
// this is another class the extends FractionalScalar and is used to represent integers
Scalar two = SimpleScalar(2);
所以如果我想表示 2a 它将是two.multiply(a);
我所做的事情应该能够进行\验证\表示数学证明。
但是由于 GeneralScalar 没有值,我必须做这样的事情
public class FractionalScalar implements Scalar
{
Scalar multiply(Scalar other)
{
if (other instanceof FractionalScalar)
{
return new FractionalScalar (this.get() * (FractionalScalar) other.get());
}
else if (other instanceof GeneralScalar)
{
//cast it to generalScalar and do stuff
}
}......
}
我不太喜欢 instanceof if then 子句,所以有没有更好的方法来完成我想要完成的任务?
最佳答案
您想要完全动态调度,但 Java 只在实例上执行动态调度程序,而不是在参数上执行动态调度程序。
摆脱 instanceof
的一种方法是当标量无法计算值时在 get()
中抛出异常。无论标量的类型如何,您都可以生成一个FractionalScalar
,或者在出现异常时生成一个GeneralScalar
。显然,最好在 Scalar
中使用像 hasValue()
这样的方法,以避免生成异常。
关于java - 如何更好地设计这段代码的类结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35165208/