Java继承扩展类时修改成员变量类型的正确实现方法
问题根源
你遇到的问题由两个原因导致:
Sim2中新增的grid2是完全独立于父类Sim1的grid1的新成员,父类draw方法固定读取grid1的内容。Sim2实例化时会先执行父类Sim1的无参构造,将grid1初始化为Grid1类型对象,和子类的grid2没有任何关联,所以渲染的始终是Grid1的内容- 原有代码的增强for循环中,
i是数组元素的临时拷贝,修改i不会写入数组本身,update方法执行后数组内容不会发生任何变化,同时原有代码存在class未小写、extends拼写错误、方法缺失返回值、super调用缺分号等语法问题
修复方案
方案1:直接复用父类成员(快速适配)
不需要在Sim2中新增grid2变量,直接在子类构造中覆盖父类的grid1赋值为Grid2实例即可,依托Java多态特性会自动调用Grid2重写后的update方法:
先修正Grid类的语法与逻辑错误
class Grid1 { public int a; public int grid[]; public Grid1(int a) { this.a = a; grid = new int[50]; } public void update() { // 改为普通for循环修改数组实际值 for (int i = 0; i < grid.length; i++) { grid[i] += a; } } } class Grid2 extends Grid1 { public Grid2(int a) { super(a); } @Override public void update() { for (int i = 0; i < grid.length; i++) { grid[i] += 2*a; } } }
修正Sim类逻辑
class Sim1 { public Grid1 grid1; public Sim1() { grid1 = new Grid1(10); } public void draw() { draw_list(grid1); } } class Sim2 extends Sim1{ public Sim2() { // 直接覆盖父类的grid1为Grid2实例,不需要额外定义grid2 this.grid1 = new Grid2(10); } }
方案2:泛型重构(适合仿真场景长期扩展)
针对你要开发多种自动机仿真的需求,用泛型抽象基类可以保证类型安全,后续新增其他Grid规则不需要修改基础框架逻辑:
// 泛型基类,限定泛型参数为Grid1或其子类 class Sim<T extends Grid1> { public T grid; public Sim(T grid) { this.grid = grid; } public void draw() { draw_list(grid); } } // 移民自动机仿真 class Sim1 extends Sim<Grid1> { public Sim1() { super(new Grid1(10)); } } // 康威生命游戏仿真 class Sim2 extends Sim<Grid2> { public Sim2() { super(new Grid2(10)); } }
这种写法下,你在Sim2中直接操作grid就是Grid2类型,不需要额外做类型转换,后续扩展新的自动机规则只要新增对应的Grid子类和Sim子类即可。
内容的提问来源于stack exchange,提问作者wil123
相关产品推荐
相关产品推荐

