如何更好地设计此代码的类结构

时间:2016-02-02 22:42:07

标签: java class oop

我正在创建一个名为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所以有没有更好的方法去做我想要完成的事情?

1 个答案:

答案 0 :(得分:2)

您希望拥有完整的动态调度,但Java仅对实例执行动态调度,而不是参数。

摆脱instanceof的一种方法是在标量无法计算值时在get()中抛出异常。无论标量的类型如何,您都会生成FractionalScalar或在出现异常的情况下生成GeneralScalar。显然,需要在hasValue()中使用Scalar之类的方法来避免生成异常。