前言 :
Scala 是一個可直譯、編譯、靜態、運行於 JVM 之上、可與 Java 互操作、融合物件導向編程特性與函式編程風格的程式語言. Scala 本身具有擴充性,不過這必須了解更多語法特性與細節. Scala 建構式有些限制,使用方法可以定義所謂運算子(Operator),提供語法蜜糖與存取方法.
建構式 :
Scala 在定義類別時,類別本體部份是主要建構式的範圍,稱之為主要建構式(Primary constructor)。例如 :
- class Account {
- // 這個區塊中整個都是主要建構式
- ...
- }
- class Account(d: String, n: String) {
- val id = d
- val name = n
- ...
- }
- class Account(val id: String, val name: String) {
- ...
- }
如果你需要定義別的建構式,則可以在類別中定義 this(..)方法,例如 :
相對於主要建構式,你使用 this 定義的建構式(方法或函式)稱之為 輔助建構式(Auxiliary constructor),在輔助建構式中第一個動作,一定得呼叫其它的輔助建構式或是主要建構式,這是透過 this(...) 來呼叫所以,所以最後一定會(要)有個輔助建構式得呼叫主要建構式. 從以上這個限制來看,輔助建構式執行建構物件所必要的基本流程,為建構物件的單一入口。以上例來看,建構帳戶時一定必需的,就是帳戶(id)、名稱(name)及餘額(bal),所以規範在主要建構式中,而無論如何,你一定得提供帳戶與名稱,而餘額可以有預設值 0,所以主要建構式的參數列必須有 id 與 name。為了建構方便,提供一個輔助建構式可以設定初始餘額,由於最後一定會有個輔助建構式呼叫主要建構式,所以 id 與 name 絕不會是預設值.
輔助建構式在定義時就如同在定義方法,輔助建構式的參數 id、name 與 bal 是val,作用範圍僅在 this(...) 方法之中(不像主要建構式,其參數 作用範圍是整個類別),如果你要讓傳入的值整個類別可用,得像上例中指定給類別成員,其中 this.bal 的 this 表示物件本身(this 的作用與其它 語言相同,例如Java). 雖然還沒談到類別的繼承,不過你可以先知道的是,由於在 Scala 中,輔助建構式第一行只能是 this(...) 來呼叫其它輔助建構式或主要建構式,所以,輔助建構式是不能呼叫父類別建構式的,在 Scala 中,只有主要建構式可以呼叫父類別建構式(可以是父類別的輔助建構式或主要建構式).
Supplement
* Tutorialspoint - Scala Classes & Objects
沒有留言:
張貼留言