我正在创建一个名为Scalar
的数据结构。该接口声明可用的操作(如乘/除/加/减)。无论如何,我有3个不同的实现Scalar
的类。由分子和分母表示的FractionalScalar
和由字符串表示的GeneralScalar
。
通常我会向Scalar
接口(如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
}
}......
}
我真的不喜欢if子句的instanceof,所以还有什么更好的方法可以完成我要完成的工作?
最佳答案
您希望拥有完整的动态调度程序,但是Java仅对实例(而不是参数)进行动态调度程序。
摆脱instanceof
的一种方法是在标量无法计算值时在get()
中引发异常。无论标量的类型如何,您都可以生成一个FractionalScalar
,或者在出现异常的情况下生成一个GeneralScalar
。显然,希望在hasValue()
中使用类似Scalar
的方法来避免生成异常。