2010-10-28 13 views
6

Sto lavorando a un compito a casa per la mia classe di progettazione orientata agli oggetti, e mi trovo nei guai con gli oggetti companion di Scala. Ho letto in alcuni punti che si suppone che gli oggetti companion abbiano accesso ai metodi privati ​​della loro classe companion, ma non riesco a farlo funzionare. (Proprio come una nota, la carne del compito ha a che fare con l'implementazione di un albero di ricerca binario, quindi non sto solo chiedendo risposte ...)Perché non riesco ad accedere ai metodi di classi private nell'oggetto compagno della classe in Scala?

Ho un oggetto che dovrebbe creare un'istanza di la mia classe privata, BstAtlas (Bst è anche definito nell'oggetto Atlas, tirò fuori per chiarezza):

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 
    ... 
    } 
} 

Ma quando vado a compilare, ottengo il seguente errore:

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

il function helpFocusRoom deve essere nascosto, ma non so come nasconderlo e ho ancora accesso ad esso all'interno dell'oggetto associato.

Qualcuno può dirmi cosa sto facendo male qui?

+0

wow .. Non ho mai saputo che esistesse un tag "compiti" – pavanred

risposta

9

Il problema è che le classi e gli oggetti complementari non possono essere nidificati in questo modo. Per definire un oggetto associato, è necessario definire la classe al di fuori del corpo dell'oggetto ma nello stesso file.

+1

Grazie, è così. Il professore ci ha detto a lezione di usare il modo nidificato sopra per nascondere i dettagli di implementazione ... Ma in questo modo sembra avere lo stesso risultato (e compila, che è un vantaggio). – Shaun

5

oggetti Companion dovrebbero essere accanto al loro oggetto reale, non lo contengono:

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 

In alternativa, è possibile modificare la portata della parola chiave protected per includere l'oggetto racchiude:

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 

ma qui non dovresti nominare l'oggetto esterno la stessa cosa della classe interiore o avrai difficoltà a riferirti ad esso all'interno della classe.

Problemi correlati