基于继承扩展n×n矩阵类为n×m通用矩阵类,不改动原有代码
嘿,这个需求太常见啦——既要扩展出通用n×m矩阵的能力,又不想动已经写好的n×n方阵代码,用继承来实现简直恰到好处!咱们一步步拆解:
核心思路:利用继承的「特殊-通用」关系
咱们把新的通用矩阵类Gmatrix作为父类,实现所有n×m矩阵的通用功能;让现有的Matrix类(n×n方阵)继承Gmatrix,这样它就能复用父类的通用逻辑,同时完全保留原有代码的行为,不用修改任何使用Matrix的业务代码。
第一步:编写通用矩阵父类 Gmatrix
这个类会处理任意维度矩阵的核心逻辑,把成员变量设为protected,方便子类直接访问:
class Gmatrix { protected float[][] entries; protected int rows; protected int cols; // 通用构造方法:创建rows×cols的矩阵 Gmatrix(int rows_, int cols_) { rows = rows_; cols = cols_; entries = new float[rows][cols]; } // 获取矩阵元素(和原Matrix类方法逻辑一致) public float[][] getEntries() { return entries; } // 设置矩阵元素,还能加维度校验增强健壮性 public void setEntries(float[][] k) { if (k != null && k.length == rows && k[0].length == cols) { entries = k; } else { println("警告:传入的矩阵维度与当前矩阵不匹配!"); } } // 新增通用方法:获取行数和列数 public int getRows() { return rows; } public int getCols() { return cols; } }
第二步:修改现有Matrix类继承Gmatrix(最小改动)
原有的Matrix代码几乎完全保留,只需要做两处小调整:
- 加
extends Gmatrix声明继承关系 - 在构造方法里调用父类的构造函数
super(n_, n_),指定方阵的行数和列数都是n
修改后的Matrix类:
class Matrix extends Gmatrix { int n; // 原有的n变量完全保留 Matrix(int n_) { super(n_, n_); // 调用父类构造,创建n×n的矩阵 n = n_; // 原代码完全保留 // 原代码里的entries初始化可以留着(虽然父类已经初始化了,但不影响功能) // entries = new float[n][n]; } // 原有的getEntries方法完全保留(和父类逻辑一致,可留可删) float[][] getEntries() { return entries; } // 原有的setEntries方法完全保留(同样可留可删,留着符合"不修改原有代码"的要求) void setEntries(float[][] k) { entries = k; } }
这样做的好处
- 完全兼容原有代码:之前所有使用
Matrix的代码(比如Matrix m = new Matrix(5);)不需要做任何改动,依然正常运行 - 复用通用逻辑:
Matrix自动拥有Gmatrix的所有功能,比如可以调用getRows()、getCols()方法 - 扩展性强:后续可以给
Gmatrix添加更多通用方法(比如矩阵加法、乘法、转置),Matrix会自动继承这些能力 - 符合开闭原则:对扩展开放(新增
Gmatrix支持任意矩阵),对修改关闭(原有Matrix代码几乎没动)
测试示例
void setup() { // 原有方阵代码正常运行 Matrix squareMat = new Matrix(3); float[][] squareData = {{1,2,3},{4,5,6},{7,8,9}}; squareMat.setEntries(squareData); println("3×3方阵:"); printMatrix(squareMat.getEntries()); // 新的通用矩阵功能 Gmatrix rectMat = new Gmatrix(2, 4); float[][] rectData = {{1,2,3,4},{5,6,7,8}}; rectMat.setEntries(rectData); println("\n2×4通用矩阵:"); printMatrix(rectMat.getEntries()); } // 辅助打印矩阵的方法 void printMatrix(float[][] mat) { for (float[] row : mat) { println(row); } }
内容的提问来源于stack exchange,提问作者Andres Mejia
相关产品推荐
相关产品推荐

