You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于继承扩展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代码几乎完全保留,只需要做两处小调整:

  1. 加extends Gmatrix声明继承关系
  2. 在构造方法里调用父类的构造函数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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 04:10:03