2011年5月18日 星期三

5-10. Data member 與 method 的 name space

在之前我們談過,Scala 的 class 宣告格式為:
class S {
  var var_n: Int = 10
  val val_s: String = "hello"
  def m(n: Int) = n + 10
}
上例中,我們宣告
1. 使用 var 宣告一個 data member 變數:var_n
2. 使用 val 宣告一個 data member 常數:val_s
3. 使用 def 宣告一個 method:m

在 Java 中,data member 與 method 的 name space 是不同的,所以 data member 與 method 可以同名。

但 Scala 中,data member 與 method 共用 name space,因此 Scala 中你不可以宣告 data member 與 method 同名。
其實,說清楚一點是,Scala 會為 data member 產生 access method。而所產生的 access method 會與 data member 同名。所以此時若再宣告同名的 method,將會造成兩個同名的 method,產生 compile 錯誤。

範例:Java 中,method 可以與 data member 同名。
class J {
  int n1 = 10;
  int n1() {
    return 10;
  }
}

範例:Scala 中,method 不可以與 data member 同名。
class S {
  var n1 = 10 // compiler 會編譯本 statement 成為一個 bytecode 的 data member,以及至少一個 access method n1()
  def n1() = 10 // compiler 會認為此 statement 重複宣告 n1()
}

沒有留言:

張貼留言