我正在创建一个名为Scalar
的数据结构。接口声明可用的操作(如multiply / divide / add / subtract)。无论如何,我有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,它将是两个。(a);
我正在做的事情应该是能够进行\ validate \代表数学证明。
但由于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 clauses所以有没有更好的方法去做我想要完成的事情?
答案 0 :(得分:2)
您希望拥有完整的动态调度,但Java仅对实例执行动态调度,而不是参数。
摆脱instanceof
的一种方法是在标量无法计算值时在get()
中抛出异常。无论标量的类型如何,您都会生成FractionalScalar
或在出现异常的情况下生成GeneralScalar
。显然,需要在hasValue()
中使用Scalar
之类的方法来避免生成异常。