鍍金池/ 教程/ Scala/ 為訪問(wèn)控制修飾符添加作用域
包對(duì)象
Ordered Trait
組合和繼承–定義 final 成員
基本數(shù)據(jù)類(lèi)型
Match 表達(dá)式
類(lèi)和對(duì)象 (三)
操作基本數(shù)據(jù)類(lèi)型
for 表達(dá)式
組合和繼承–重載成員函數(shù)和方法
類(lèi)和對(duì)象 (二)
組合和繼承–定義 factory 對(duì)象
組合和繼承–多態(tài)和動(dòng)態(tài)綁定
Trait 的基本概念
if 表達(dá)式
組合和繼承–抽象類(lèi)
函數(shù)–函數(shù)字面量的一些簡(jiǎn)化寫(xiě)法
while 循環(huán)
組合和繼承–使用組合還是繼承?
訪問(wèn)控制修飾符
Trait 示例–Rectangular 對(duì)象
組合和繼承–定義參數(shù)化成員變量
組合和繼承–定義無(wú)參數(shù)方法
類(lèi)和對(duì)象 (一)
函數(shù)–閉包
函數(shù)–類(lèi)成員函數(shù)
Scala 基本數(shù)據(jù)類(lèi)型的實(shí)現(xiàn)方法
try 表達(dá)式處理異常
選擇瘦接口還是胖接口設(shè)計(jì)?
組合和繼承–小結(jié)
創(chuàng)建新的控制結(jié)構(gòu)
使用 import
為訪問(wèn)控制修飾符添加作用域
Scala 的類(lèi)層次關(guān)系
類(lèi)和對(duì)象 (五)
傳名參數(shù)
柯里化函數(shù)
函數(shù)–頭等公民
組合和組合和繼承–定義 heighten 和 widen 函數(shù)
使用 Package–將代碼放入包中
隱含的 import
所有類(lèi)的公共子類(lèi)–底層類(lèi)型
進(jìn)一步 Scala
函數(shù)–局部函數(shù)
引用包中的代碼
組合和繼承–使用 override 修飾符
組合和繼承–實(shí)現(xiàn)類(lèi) Element 的 above,beside 和 toString()方法
類(lèi)和對(duì)象 (四)
函數(shù)–尾遞歸
沒(méi)有“break”和“continue”的日子
組合和繼承–調(diào)用基類(lèi)構(gòu)造函數(shù)
減低代碼重復(fù)
函數(shù)–函數(shù)–可變參數(shù),命名參數(shù),缺省參數(shù)
起步 Scala
組合和繼承–擴(kuò)展類(lèi)
函數(shù)–部分應(yīng)用的函數(shù)
開(kāi)始神奇的 Scala編程之旅
組合和繼承–概述
Trait 用來(lái)實(shí)現(xiàn)可疊加的修改操作

為訪問(wèn)控制修飾符添加作用域

Scala 的訪問(wèn)修飾符可以添加作用域參數(shù)。作用域的語(yǔ)法如下:

private[x]或protected[x]

其中 x 代表某個(gè)包,類(lèi)或者對(duì)象,表示可以訪問(wèn)這個(gè) Private 或的 protected 的范圍直到 X。

通過(guò)為訪問(wèn)修飾符添加作用域參數(shù),可以非常精確的控制所定義的類(lèi)型能夠被其它類(lèi)型訪問(wèn)的范圍。尤其是可以支持 Java 語(yǔ)言支持的 package private,package protected 等效果。

下面的例子為這種用法的一個(gè)示例:

package bobsrockets
package navigation{
  private[bobsrockets] class Navigator{
    protected[navigation] def useStarChart(){}
    class LegOfJourney{
        private[Navigator]  val distance=100
      }
    private[this] var speed = 200
    }
  }
  package launch{
    import navigation._
    object Vehicle{
      private[launch] val guide=new Navigator
    }
}

在這個(gè)例子中,類(lèi) Navigator 使用 private[bobsrockets] 來(lái)修飾,這表示這個(gè)類(lèi)可以被 bobsrockets 中所有類(lèi)型訪問(wèn),比如通常情況下 Vehicle 無(wú)法訪問(wèn)私有類(lèi)型 Navigator,但使用包作用域之后,Vechile 中可以訪問(wèn) Navigator。

這種技巧在分散在多個(gè) Package 的大型項(xiàng)目時(shí)非常有用,它允許你定義一些在多個(gè)子包中可以訪問(wèn),但對(duì)使用這些 API 的外部客戶(hù)代碼隱藏,而這種效果在 Java 中是無(wú)法實(shí)現(xiàn)的。

此外,Scala 還支持一種比 private 還要嚴(yán)格的訪問(wèn)控制,本例中的 private[this],只允許在定義該成員的類(lèi)型中訪問(wèn),它表示該成員不僅僅只能在定義該成員的類(lèi)型中訪問(wèn),而且只能是由該類(lèi)型本身訪問(wèn)。比如:本例中 speed,使用 protected[this],speed,和 this.speed 只在定義該成員的實(shí)例中可以訪問(wèn),下面的用法也是不合法的,即使它們也在 Navigator 里面。當(dāng)由于是新創(chuàng)建的另外的實(shí)例,編譯出錯(cuò):

http://wiki.jikexueyuan.com/project/scala-development-guide/images/19.png" alt="" />