2010-10-28 24 views
6

Je travaille sur un devoir pour ma classe de conception orientée objet, et j'ai des problèmes avec les objets compagnons de Scala. J'ai lu dans quelques endroits que les objets compagnons sont supposés avoir accès aux méthodes privées de leur classe d'accompagnement, mais je n'arrive pas à le faire fonctionner. (Juste comme une note, la viande de la cession a dû faire avec l'implémentation d'un arbre de recherche binaire, donc je ne demande pas seulement des réponses ...)Pourquoi ne puis-je pas accéder aux méthodes de classes privées dans l'objet compagnon de la classe dans Scala?

J'ai un objet qui est censé créer une instance de ma classe privée, BstAtlas (Bst est également défini dans l'objet Atlas, a pris pour plus de clarté):

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

Mais quand je vais compiler, je reçois l'erreur suivante:

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

le function helpFocusRoom doit être caché, mais je ne sais pas comment le cacher et y avoir toujours accès à l'intérieur de l'objet compagnon. Est-ce que quelqu'un peut me dire ce que je fais mal ici?

+0

wow .. Je n'ai jamais su qu'il y avait un "devoir" tag – pavanred

Répondre

9

Le problème est que les classes et les objets compagnons ne peuvent pas être imbriqués comme cela. Pour définir un objet compagnon, vous devez définir la classe en dehors du corps de l'objet mais dans le même fichier.

+1

Merci, ça y est. Le professeur nous a dit en conférence d'utiliser la manière imbriquée ci-dessus pour cacher les détails d'implémentation ... Mais cette façon semble avoir le même résultat (et compile, ce qui est un plus). – Shaun

5

objets compagnon doivent être à côté de leur objet réel, ne contenant:

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 

Vous pouvez modifier la portée du mot-clé protected pour inclure l'objet englobante:

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 

mais Ici, vous ne devez pas nommer l'objet extérieur comme la classe interne ou vous aurez du mal à vous y référer depuis l'intérieur de la classe.