继承Rectangle类实现Square类时grow方法重写问题如何解决
问题分析
- 冗余属性问题:你在Square子类中重复声明了
x、y、s三个属性,父类Rectangle本身已经持有这些坐标和尺寸参数,你子类单独声明的属性不会跟随父类方法的修改自动同步,会出现数据不一致的问题,直接删掉这三个属性即可。 - 原有grow方法逻辑错误:你直接调用父类
grow(one, two)如果两个传入的增量值不等,执行后父类的宽高就会变成不同的值,直接破坏正方形特性,后续调用add方法修正的逻辑冗余且容易出问题。
修正方案
grow方法的核心需求是「至少满足指定的宽高增量、同时保持正方形」,所以只需要取两个传入增量的最大值作为宽高共同的增量,直接调用父类的grow方法传入两个相同的增量值即可,不需要额外调用add方法。
修正后的完整代码
public class Square extends Rectangle{ public Square(int x, int y, int s) { super(x,y,s, s); } @Override public void add(int one, int two) { super.add(one, two); super.add(this.getX() + this.getHeight(), this.getY() + this.getWidth()); } @Override public void add(Rectangle rec) { super.add(rec); super.add(this.getX() + this.getHeight(), this.getY() + this.getWidth()); } @Override public void grow(int one, int two) { // 取两个增量的最大值,保证至少满足指定增长要求,同时宽高增量相等维持正方形 int maxDelta = Math.max(one, two); super.grow(maxDelta, maxDelta); } }
内容的提问来源于stack exchange,提问作者Banan
相关产品推荐
相关产品推荐

