6.14 结语
在本章,你看到了有关Scala类的更多内容,了解了如何给类添加参数,如何定义多个构造方法,如何像定义方法那样定义操作符,以及如何定制化类以让其用起来更自然。最为重要的一点可能是,你应该已经意识到在Scala中定义和使用不可变对象是很自然的一种编程方式。
虽然本章展示的最后一个版本的Rational类满足了章节开始时设定的需求,但是它仍然有提升空间。事实上,在本书后面的章节还会重新回顾这个示例。比如,在第8章,你将了解到如何重写equals和hashCode方法,让Rational类可以更好地参与==的比较或者被存入哈希表的场景;在第22章,你将了解到如何把扩展方法的定义放到Rational类的伴生对象中,让使用Rational类的程序员更容易地将它放到作用域内。
[1]require方法定义在Predef这个独立对象中。如4.5节所讲的,所有的Scala源文件都会自动引入Predef对象的成员。
[2]实际上,可以把Rational对象与自己相加,这时that会指向执行add方法调用的那个对象。但由于你可以传入任何Rational对象到add方法中,因此编译器仍然不允许使用that.n。
[3]你将在10.6节找到更多关于参数化字段(parametric field)的内容。该内容提供了同样功能的代码的简写方式。
[4]虽然n和d在类定义体中被使用,但是由于它们只出现在构造方法中,Scala编译器并不会为它们生成字段,因此,对于这样的代码,Scala编译器将会生成一个带有两个Int字段的类,且两个字段分别是numer和denom。
[5]这种风格的标识符命名方式被称作驼峰命名法,是因为标识符内的那些间隔出现的大写字母就像是骆驼背上的驼峰一样。
[6]在14.5节,你将了解到有时候可能需要完全用操作符来对样例类命名。例如,Scala的API包含一个名称为::的类,用于实现对List的模式匹配。
[7]更准确地说,操作符包括Unicode中的数学符号(Sm)或其他符号(So),以及ASCII码表中除字母、数字、圆括号、方括号、花括号、单引号、双引号、下画线、句点、分号、逗号、反引号(back tick)之外的7位(7-bit)字符。