2010-10-28 5 views
6

Ich arbeite an einer Hausaufgabe für meine objektorientierte Design-Klasse, und ich habe Probleme mit den Begleitobjekten von Scala. Ich habe an einigen Stellen gelesen, dass Companion-Objekte Zugriff auf die privaten Methoden ihrer Companion-Klasse haben sollen, aber ich kann nicht scheinen, dass es funktioniert. (Nur eine Anmerkung, das Fleisch der Aufgabe hatte mit der Implementierung eines binären Suchbaums zu tun, also frage ich nicht nur nach Antworten ...)Warum kann ich nicht auf private Klassenmethoden im Begleitobjekt der Klasse in Scala zugreifen?

Ich habe ein Objekt, das eine Instanz von erstellen soll meine private Klasse, BstAtlas (Bst auch im Atlas-Objekt definiert ist, dauerte es für Klarheit out):

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

Aber wenn ich zu kompilieren gehen, bekomme ich folgende Fehlermeldung:

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

die Die Funktion helpFocusRoom muss ausgeblendet werden, aber ich weiß nicht, wie ich sie verstecken und trotzdem darauf zugreifen kann innerhalb des Begleitobjekts.

Kann mir jemand sagen, was ich hier falsch mache?

+0

wow .. Ich wusste nie, dass es ein "Hausaufgaben" -Tag gab – pavanred

Antwort

9

Das Problem ist, dass Klassen und Companion-Objekte nicht so verschachtelt werden können. Um ein Begleitobjekt zu definieren, müssen Sie die Klasse außerhalb des Körpers des Objekts, aber in derselben Datei definieren.

+1

Danke, das tut es. Der Professor sagte uns in der Vorlesung, dass wir den verschachtelten Weg oben benutzen sollen, um Implementierungsdetails zu verbergen ... Aber dieser Weg scheint das gleiche Ergebnis zu haben (und kompiliert, was ein Plus ist). – Shaun

5

Companion Objekte sollten auf ihre eigentliche Aufgabe als nächstes, enthält es nicht:

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 

Alternativ Sie den Umfang des protected Schlüsselwort ändern können das einschließende Objekt enthalten:

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 

aber Hier solltest du das äußere Objekt nicht das gleiche nennen wie die innere Klasse oder du wirst Probleme haben, es innerhalb der Klasse zu erwähnen.

Verwandte Themen