如何在java中定义不同对象之间的常用操作?

时间:2010-12-22 16:27:54

标签: java operator-overloading code-reuse

我有许多不同类型的操作数,并想要定义如何 这些操作数可以相互操作。这似乎是一般的 问题,但我没有找到一个好的方法来实现它。

首先说我有标量(即数字),矩阵和集合 矩阵或标量,我想在这些上定义加号操作:

  • scalar1.plus(scalar2)返回一个等于scalar1 + scalar2的标量,

  • matrix.plus(scalar1)或scalar.plus(matrix)都返回一个矩阵 其中'scalar1'每个元素都被添加到了每个元素中 矩阵,

  • matrixSet.plus(matrix1)返回每个矩阵所在的集合 添加到matrix1

等等......请注意,某些操作可能会抛出异常,例如 添加不同大小的矩阵或添加不具有的矩阵 相同数量的元素。

我的目标如下:

1-重复使用尽可能多的代码(重要的是因为我会有很多代码      更多操作和数据类型),

2-尽可能在编译时进行验证

3-使将来添加新数据类型或操作变得容易(for      例如,我可能想稍后添加矢量数据类型

我最初认为我会定义一个操作数界面,我的 标量,矩阵和这些元素的集合将实现,以及哪些 将包括如下方法:

public Operand plus(Operand op);

这样可以自下而上定义加号操作, 从最简单的元素(标量)开始:

public Operand plus(Operand operand) {
  if (Scalar.class.equals(operand.getClass())) {
    return new Scalar(this.value + ((Scalar) operand).getValue());
  } else {
   // assume the other operand will define the addition for me
   // since add is commutative
    return operand.plus(this);
  }
}

然后是矩阵:

public Operand plus(Operand operand) {
  if (Scalar.class.equals(operand.getClass())) {
    // return a matrix where we add scalar value to all matrix elements
  } else if (Matrix.class.equals(operand.getClass())) {
    // return a matrix where we perform a scalar addition between each element
  } else {
    // assume the other operand will define the addition for me
    // since add is commutative
    return operand.plus(this);
  }
}

这个想法是每当我介绍一个新的类来实现 操作数类型(比如矢量),我只需要定义加号 操作在新操作数和所有其他操作数之间 操作数。即我不必重写的加号方法 标量和矩阵类。

此方法符合目标1和3,但不符合2:所有操作都返回 操作数对象,迫使我做很多演员和课堂 在运行时检查,这似乎不是一个好的做法。

有什么更好的方式解决我的问题?

4 个答案:

答案 0 :(得分:1)

听起来你需要使用adapter pattern。您基本上将定义一个通用接口,然后根据需要以多种方式调整接口以适应您的需求。

答案 1 :(得分:0)

我不确定我理解你为什么要使用Operand界面。看起来你的主要代码重用技术是在操作数已经定义了操作时调用操作数上的操作。但是使用界面并没有帮助你。我错过了什么?不这样做会涉及相同数量的代码,但允许诸如特定返回类型和异常之类的好东西吗?

标量:

public Scalar plus(Scalar operand) {
    return new Scalar(this.value + operand.getValue());
}

public Matrix plus(Matrix operand) {
    return operand.plus(this);
}

矩阵:

public Operand plus(Scaler operand) {
    return new Scalar(this.value + operand.getValue());
}

public Operand plus(Matrix operand){
  // return matrix plus matrix
}

答案 2 :(得分:0)

经过一些来回,我决定通过为我创建的每种类型的数据定义操作来正确处理问题。无论我尝试什么,它都运作不佳。

我最终做的是在整数上定义每个操作一个类。例如。 Addition,Multiply,Addition8BitSat等。另外,我有一个Evaluator类,我定义如何在两个块之间,一个块和一个整数之间,一组块和整数等之间导出一个操作,基于结果单独整数之间的操作。

这种方法解决了我上面列出的三个问题:我的代码中的零冗余,返回正确类型结果的方法,以及可以轻松扩展到其他类型的方法。

答案 3 :(得分:0)

使用java执行此操作的正确方法是在数据类中定义操作方法并根据需要进行重载。如果你有一个矩阵类,那么这个类需要知道如何向自己添加另一个矩阵,并为自己添加一个标量。我不知道你是否有一个特殊的理由来分离操作数和运算符,否则这是正确的方法。这里有一些代码来澄清这个概念:

class Matrix{
  Matrix add(Matrix m){
    //add matrix to self
    return this;
  }
  Matrix add(Scalar s){
    //add scalar to self
    return this;
  }
}