Rational类方法互相调用问题:如何在divide方法中调用multiply方法
解决Rational类中divide方法复用multiply逻辑的问题
嘿,你的思路特别棒——既然除法本质是乘以除数的倒数,那复用已经写好的multiply方法完全是正确的选择,能避免重复代码还能保证逻辑一致性。不过当前代码里有两个小问题需要调整,我一步步给你讲:
首先,避免修改传入的原对象
你现在直接调用other.invert()会修改传入的那个Rational实例,这会带来意外的副作用:比如你在调用divide之后,原来的other对象的分子分母就被反转了,后续再使用它时会得到错误的结果。这可不是我们想要的。
正确的实现方式
我们分两种情况来处理,优先推荐第一种(更符合面向对象的不变性原则):
方案1:让invert方法返回一个新的Rational对象(推荐)
先给你的Rational类添加一个返回新倒数对象的invert方法,而不是修改自身:
public Rational invert() { // 返回一个新的Rational,分子是原分母,分母是原分子 return new Rational(this.Denominator, this.Numerator); }
然后divide方法就可以直接调用multiply了:
public Rational divide(Rational other) { // 调用multiply,参数是other的倒数对象 return this.multiply(other.invert()); }
方案2:如果invert是修改自身的方法(不推荐但兼容现有代码)
如果你已经写了一个修改自身的invert方法(比如void invert()),那我们需要先创建other的副本,再反转副本,避免影响原对象:
// 假设你已有这样的invert方法 public void invert() { int temp = this.Numerator; this.Numerator = this.Denominator; this.Denominator = temp; } // 对应的divide实现 public Rational divide(Rational other) { // 先复制other的副本,避免修改原对象 Rational temp = new Rational(other.Numerator, other.Denominator); temp.invert(); // 调用multiply方法,传入反转后的副本 return this.multiply(temp); }
额外小建议
另外,你当前的乘法和除法结果没有化简分数(比如new Rational(2,4)其实等于1/2),可以考虑在构造方法里添加一个化简逻辑,用最大公约数(GCD)来约分,这样你的Rational类会更严谨哦。
内容的提问来源于stack exchange,提问作者Amro Okasha
相关产品推荐
相关产品推荐

