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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:08:45