我有一个界面IMatrix:
public interface IMatrix {
int[][] data = null;
public int rows = 0;
public int cols = 0;
int getElement(int row, int column);
void setElement(int row, int column, int value);
IMatrix sum(IMatrix m1, IMatrix m2);
IMatrix product(IMatrix other);
boolean equals(IMatrix other);
String toString();
}
例如,下面是一个sum()我想在每个类中以不同方式实现的方法,但是当访问 fields 时rows,colsEclipse 会抛出警告:
静态字段 IMatrix.cols 应该以静态方式访问
我不太明白如何在实现接口的类中正确实现方法。
以下是我尝试在类中实现此方法的UsualMatrix方法IMatrix:
@Override
public IMatrix sum(IMatrix m1, IMatrix m2) {
if ((m1.rows != m2.rows) || (m1.cols != m2.cols)) {
throw new MatrixOperationException("Matrices must be the same size to be added together.");
}
UsualMatrix mtxFinal = new UsualMatrix(rows, cols);
for (int i = 0; i < this.rows; i++) {
for (int j = 0; j < this.cols; j++) {
mtxFinal.data[i][j] = m1.data[i][j] + m2.data[i][j];
}
}
return mtxFinal;
}
由于主要问题已经提出:创建界面时如何正确使用字段?,答案可能是:
前面的答案指出,接口中的“字段”是静态的(即,它们适用于实现给定接口的所有实例),但即使省略相应的修饰符,它们也是最终的(常量)
final。在接口中定义它们并为它们分配一些初始值是没有意义的 - 对于所有
IMatrix实现,的实例data将始终分别等于,null和0,并且这是无法更改的。rowscols事实上,在方法的实现中只出现了 Eclipse 的警告,
sum这仅意味着类中要么编写了存根而不是构造函数,要么UsualMatrix已经添加了类似的实例字段,否则在尝试分配时会出现编译错误最终变量的值:不幸的是,Java 在声明静态变量和实例变量时允许类似的同音异义词。
接下来我们看看该方法的实现
sum。NullPointerException显然,当尝试执行此方法时,尝试直接访问变量datafor 变量m1( ) 时会抛出异常:m2因为它们是用一种类型声明的
IMatrix,在该类型的上下文中只有一个静态常量data等于null!基于上述,为了“正确”使用字段,它们应该从接口中完全删除
IMatrix,例如,移动到某个基(抽象)类,如 @talex 和 @RomanC 之前的答案所示,并且仅矩阵大小的 getter 应该留在接口和读取/写入元素的方法中。在同一个基/抽象类中,应分别实现类方法
Objectequals(以便正确调用重载版本equals(IMatrix that))hashCode和/或toString。矩阵运算的方法可以放置在一个单独的类中,该类封装了处理矩阵的算法。
实施示例:
如果需要,您可以实现构造函数来复制原始数组或简单地分配对数组的引用等。
在这种矩阵处理算法的实现中,仅使用了相应的接口方法
IMatrix,而没有“直接”访问实例字段。接口字段始终是静态的。你需要一个抽象类。