- Scala編程(第5版)
- (德)馬丁·奧德斯基等
- 629字
- 2022-05-06 15:51:45
6.7 輔助構造方法
有時需要給某個類定義多個構造方法。在Scala中,主構造方法之外的構造方法稱為輔助構造方法(auxiliary constructor)。例如,一個分母為1的有理數可以被更緊湊地直接用分子表示,如5/1可以被簡單地寫成5。因此,如果Rational類的使用方可以直接寫Rational(5)而不是Rational(5, 1),則可能是一件好事。這需要我們給Rational類添加一個額外的輔助構造方法,只接收一個參數,即分子,而分母被預定義為1。示例6.2給出了相關代碼。
Scala的輔助構造方法以def this(...)開始。Rational類的輔助構造方法的方法體只是調用一下主構造方法,透傳它唯一的參數n作為分子,1作為分母。可以在編譯器中輸入如下代碼來實際觀察輔助構造方法的執行效果:


示例6.2 帶有輔助構造方法的Rational類
在Scala中,每個輔助構造方法都必須首先調用同一個類的另一個構造方法。換句話說,Scala每個輔助構造方法的第一條語句都必須是這樣的形式:“this(...)”。被調用的這個構造方法要么是主構造方法(就像Rational示例那樣),要么是另一個出現在發起調用的構造方法之前的另一個輔助構造方法。這個規則的凈效應是Scala的每個構造方法最終都會調用該類的主構造方法。這樣一來,主構造方法就是類的單一入口。
注意
如果你熟悉Java,則可能會好奇為什么Scala的構造方法規則比Java更嚴格。在Java中,構造方法要么調用同一個類的另一個構造方法,要么直接調用超類的構造方法。而在Scala中,只有主構造方法可以調用超類的構造方法。Scala這個增強的限制實際上是一個設計的取舍,用來換取更精簡的代碼和與Java相比更為簡單的構造方法。我們將會在第10章詳細介紹超類,以及構造方法和繼承的相互作用。