有一些Matrix库,每个都有他们的商品和坏商品 - 所以我决定现在我想使用一个通用的界面,这样我以后就可以轻松地将一个库切换到另一个库。
我所拥有的是:
public interface IMatrix {
public IMatrix add(IMatrix matrix);
public IMatrix multiply(IMatrix matrix);
...
}
在代码中:
IMatrix someMatrix = MatrixFactory.createDenseMatrix(3,5);
//I'm using a MatrixFactory to hide the different implementation constructors
作为一个例子,假设我想使用EJML和La4j的基类来实现这个IMatrix。 我想到了两个解决方案,没有一个完美:
这似乎有效,即使有点麻烦:
class SimpleMatrixInside implements IMatrix{
private final SimpleMatrix matrix;
SimpleMatrixInside(SimpleMatrix m) {
matrix = m;
}
@Override
public IMatrix add(IMatrix someMatrix) {
SimpleMatrixInside toSum = (SimpleMatrixInside)someMatrix;
return new SimpleMatrixInside(matrix.plus(toSum.matrix));
}
@Override
public void set(int row, int col, double val) {
this.matrix.set(row,col, val);
}
@Override
public IMatrix multiply(IMatrix matrix) {
SimpleMatrix toMultiply= ((SimpleMatrixInside)matrix).matrix;
return new SimpleMatrixInside(this.matrix.mult(toMultiply));
}
这似乎是一个坏主意,因为类方法可以被覆盖,无论如何它的方法会返回错误类型的对象 - 我不知道它是如何工作的。
class La4jDenseMatrix extends Basic2DMatrix implements IMatrixPar {
@Override
public IVector multiply(IMatrix matrix) {
return this.mult(matrix);
}
}
我认为解决方案1 是实现这一目标的唯一方法 - 还有其他更好的方法吗?
C ++的相关问题:Hiding multiple implementations behind a single interface
答案 0 :(得分:2)
是的,解决方案1是正确的方法。这具有明显的优势,可以让您控制如何将每个实现类的API映射到IMatrix。
想象一下两个具有相似功能但不同方法调用的不同API。规范化的唯一方法就是你在建议1中提出的建议。