java - 如何更好地设计这段代码的类结构

标签 java class oop

我正在制作一个名为标量的数据结构。该接口(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/

相关文章:

java - 无法创建与 hsqldb 的可池连接

c# - 我们可以用 C# 中的对象替换 if 语句吗

java - 将 BufferedImage TYPE_INT_RGB 转换为 OpenCV Mat 对象

java - Android 将字符串名称转换为 R.drawable.name

Java runOnUiThread 和 Thread.sleep

c++ - 在类中初始化 boost::multi_array

c++ - 是否可以在 C++ 中授予顶级函数访问对象成员的权限?

java - Box 类,getFull() 方法不会显示准确的 boolean 结果

c++ - 类包含与类继承

php - undefined index 和 undefined variable ,但两者都已定义! (我认为....)