![Scala编程(第4版)](https://wfqqreader-1252317822.image.myqcloud.com/cover/353/38381353/b_38381353.jpg)
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人
6.5 添加字段
现在主构造器已经正确地保证了它的前置条件,我们将注意力转向如何支持加法。我们将给Rational类定义一个add方法,接收另一个Rational作为参数。为了保持Rational不可变,这个add方法不能将传入的有理数加到自己身上,它必须创建并返回一个新的持有这两个有理数的和的Rational对象。你可能会认为这样写add是OK的:
![](https://epubservercos.yuewen.com/E8DF3B/20205397808551606/epubprivate/OEBPS/Images/40272-00-131-2.jpg?sign=1739140594-7tysY4mPqWhf1TwHkXZ3w3mezWz1VtE8-0-50bd15af1ab4be2dc0646fbde971b401)
不过,就这段代码而言编译器会报错:
![](https://epubservercos.yuewen.com/E8DF3B/20205397808551606/epubprivate/OEBPS/Images/40272-00-131-3.jpg?sign=1739140594-vQnkIZN5TsR6505p0nHE7UUx8kR1FxBQ-0-413bc09ac589a8a69775d354a4fe0373)
虽然类参数n和d在你的add方法中是在作用域内的,但只能访问执行add调用的那个对象上的n和d的值。因此,当你在add实现中用到n或d时,编译器会提供这些类参数对应的值,但它并不允许使用that.n或that.d,因为that并非指向你执行add调用的那个对象。[2]要访问that的分子和分母,需要将它们做成字段。示例6.1展示了如何将这些字段添加到Rational类。[3]
在示例6.1的这个Rational版本中,我们添加了两个字段,numer和denom,分别用类参数n和d的值初始化。[4]我们还修改了toString和add方法的实现,使用这两个字段,而不是类参数。这个版本能够编译通过。可以拿有理数做加法来测试它:
![](https://epubservercos.yuewen.com/E8DF3B/20205397808551606/epubprivate/OEBPS/Images/40272-00-132-1.jpg?sign=1739140594-7cwLqiyL3xhiEdK2DI7MmFJGOplZfRJ7-0-a47a6ceef530f212fad59aa49acc5518)
示例6.1 带有字段的Rational
![](https://epubservercos.yuewen.com/E8DF3B/20205397808551606/epubprivate/OEBPS/Images/40272-00-132-2.jpg?sign=1739140594-S9x5Xc4QRT93uQA3mHklbVEOkGUc69XC-0-a14ce67483af3b9e36f454a78f44b7d3)
还有另一个你之前不能做但现在可以做的事,那就是从对象外部访问分子和分母的值。只需要访问公共的numer和demon字段即可,就像这样:
![](https://epubservercos.yuewen.com/E8DF3B/20205397808551606/epubprivate/OEBPS/Images/40272-00-133-1.jpg?sign=1739140594-wbT6Rzv2EmxgGYngCH6txro3JhmJxz1U-0-0741d8021a5aced96a5d714531cf0f80)