gpt4 book ai didi

java - 隐藏接口(interface)后面的多个(给定)实现

转载 作者:行者123 更新时间:2023-12-02 05:44:11 25 4
gpt4 key购买 nike

有一些 Matrix 库,每个库都有其优点和缺点 - 所以我决定现在我想使用一个通用接口(interface),以便我以后可以轻松地从一个库切换到另一个库。

我所拥有的是这样的:

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。我想到了两种解决方案,但都不完美:

解决方案 1 - 创建基类的包装器:

这似乎有效,尽管有点麻烦:

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));
}

想法 2 - 扩展基类:

这似乎是一个坏主意,因为类方法可以被重写,并且无论如何它的方法都会返回错误类型的对象 - 我不知道这是如何工作的。

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

最佳答案

是的,解决方案 1 是正确的方法。这具有明显的优势,让您可以控制如何将每个实现类的 API 映射到 IMatrix。

想象一下两个不同的 API,它们具有相似的功能,但方法调用不同。使这种情况正常化的唯一方法正是您在建议 1 中提出的。

关于java - 隐藏接口(interface)后面的多个(给定)实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24238975/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com