2010-10-28 116 views
6

我正在爲面向對象的設計類做家庭作業,而且我遇到了Scala伴侶對象的麻煩。我已經在幾個地方讀到了伴侶對象應該可以訪問他們的伴侶類的私有方法,但我似乎無法讓它工作。 (就像一個筆記,作業的肉與實施二叉搜索樹,所以我不只是要求答案...)爲什麼我無法訪問Scala中類的伴侶對象中的私有類方法?

我有一個對象,應該創建一個實例我的私有類,BstAtlas(BST在阿特拉斯對象還定義了它的清晰度):

object Atlas {            
    def focusRoom(newRoom:Room,a:Atlas):Atlas = a.helpFocusRoom(newRoom); 

    abstract class Atlas { 
    ... 
    protected def helpFocusRoom(n:Room):Atlas; 
    ... 
    } 

    private class BstAtlas(bst:Bst) extends Atlas { 
    ... 
    protected def helpFocusRoom(newRoom:Room):Atlas = ... 
     // uses some of bst's methods 
    ... 
    } 
} 

但是,當我去編譯,我得到以下錯誤:

Question23.scala:15: error: method helpFocusRoom cannot be accessed in Atlas.Atlas a.helpFocusRoom(newRoom);

的函數helpFocusRoom需要隱藏,但我不知道如何隱藏它並仍然可以訪問它在伴侶對象的內部。

任何人都可以告訴我我在做什麼錯嗎?

+0

哇..我從來不知道有一個「家庭作業」標籤 – pavanred 2010-10-28 18:31:42

回答

9

問題是類和伴侶對象不能像這樣嵌套。要定義伴隨對象,您需要在對象正文外定義該類,但要在同一個文件中定義該類。

+1

謝謝,就是這樣。教授在講座中告訴我們使用上面的嵌套方式來隱藏實現細節......但這種方式似乎具有相同的結果(並且編譯,這是一個加號)。 – Shaun 2010-10-28 18:43:51

5

伴侶的對象應該是未來其真實目的,不包含它:

object Example { 
    class C(val i: Int = C.DefaultI) { } 
    object C { protected val DefaultI = 5 } 
} 

scala> (new Example.C).i 
res0: Int = 5 

scala> Example.C.DefaultI 
<console>:11: error: value DefaultI cannot be accessed in object Example.C 
    Example.C.DefaultI 

或者,你可以改變protected關鍵字的範圍,包括封閉的對象:

object Example { 
    def value = (new D).hidden 
    class D(val i: Int = 5) { 
    protected[Example] def hidden = i*i 
    } 
} 

scala> Example.value 
res1: Int = 25 

但在這裏你不應該把外部對象命名爲內部類,或者你會在類內引用它。

相關問題