我正在创建一个名为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的方法来避免生成异常。

10-08 09:31