我正在Matrix
用 Java 创建一个类以在线性代数程序中使用。现在它拥有双打,但我想抽象它。
我创建了一个名为 的接口MatrixElement
,它将包含add
、multiply
、divide
以及执行这些矩阵运算所需的任何其他算术方法。
这是该Matrix
课程的一个片段:
public class Matrix<T extends MatrixElement> {
private ArrayList<ArrayList<T>> rows;
public Matrix(int numRows, int numCols) {
if (numRows <= 0) {
throw new IllegalArgumentException("Matrix must have at least one row.");
}
if (numCols <= 0) {
throw new IllegalArgumentException("Matrix must have at least one column.");
}
this.rows = new ArrayList<ArrayList<T>>();
for (int r = 0; r < numRows; r++) {
ArrayList<T> row = new ArrayList<T>();
for (int c = 0; c < numCols; c++) {
row.add(new T());
}
this.rows.add(row);
}
}
/* lots of methods omitted */
public static Matrix sum(Matrix a, Matrix b) {
if (a.numRows() != b.numRows() || a.numCols() != b.numCols()) {
throw new IllegalArgumentException("Matrices must be the same size.");
}
Matrix sum = new Matrix(a.numRows(), b.numCols());
for (int r = 1; r <= b.numRows(); r++) {
for (int c = 1; c <= b.numCols(); c++) {
sum.setEntry(r, c, a.getEntry(r, c).add(b.getEntry(r, c)));
}
}
return sum;
}
public Matrix add(Matrix matrix) {
return Matrix.sum(this, matrix);
}
}
以下是方法的声明方式MatrixElement
public interface MatrixElement {
public MatrixElement add(MatrixElement e);
}
最后,这是我创建的实现此接口的示例类:
public class Fraction implements MatrixElement {
private BigInteger numerator;
private BigInteger denominator;
public Fraction(int num, int denom) {
numerator = BigInteger.valueOf(num);
denominator = BigInteger.valueOf(denom);
}
@Override
public Fraction add(MatrixElement e) {
Fraction f;
try {
f = (Fraction) e;
} catch (ClassCastException cce) {
throw new IllegalMatrixOperationException("Cannot add " + this.getClass().toString() + " and " + e.getClass().toString());
}
/* addition code omitted */
return this;
}
}
这里的主要思想是:
Matrix
对象可以包含任何一个实现该接口的类的实例MatrixElement
MatrixElement
包含矩阵操作所需的算术方法,例如add
- 踢球者:实现的类
MatrixElement
只能在同一类的其他实例上使用其方法。例如,Fraction
只能添加到其他Fraction
实例。两个类可以实现MatrixElement
,但它们不一定能够相互添加。
我由另一个程序员运行了这个设计,并被告知这样的铸造是不好的做法。如果是这样,这样做的正确方法是什么?如何使用接口对具有类似功能的类进行“分组”,以用于参数化,然后限制所述接口的哪些子级可以在子级方法中使用?