2010-10-28 16 views
6

Estoy trabajando en una tarea para la clase de diseño orientado a objetos, y estoy teniendo problemas con los objetos complementarios de Scala. He leído en algunos lugares que se supone que los objetos acompañantes tienen acceso a los métodos privados de su clase compañera, pero parece que no puedo hacer que funcione. (Solo como una nota, la parte fundamental de la tarea tenía que ver con la implementación de un árbol de búsqueda binario, así que no solo estoy pidiendo respuestas ...)¿Por qué no puedo acceder a los métodos de clase privados en el objeto complementario de la clase en Scala?

Tengo un objeto que se supone que crea una instancia de mi clase privada, BstAtlas (BST también se define en el objeto de Atlas, se llevó a cabo para mayor claridad):

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

Pero cuando voy a compilar, me sale el siguiente error:

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

el función helpFocusRoom debe estar oculto, pero no sé cómo ocultarlo y aún así tener acceso a él dentro del objeto compañero.

¿Alguien puede decirme qué estoy haciendo mal aquí?

+0

wow .. Nunca supe que haya una etiqueta de "tarea" – pavanred

Respuesta

9

El problema es que las clases y los objetos complementarios no se pueden anidar así. Para definir un objeto complementario, necesita definir la clase fuera del cuerpo del objeto pero en el mismo archivo.

+1

Gracias, eso lo hace. El profesor nos dijo en una conferencia que usáramos el modo anidado arriba para ocultar los detalles de implementación ... Pero de esta manera parece tener el mismo resultado (y compila, lo cual es un plus). – Shaun

5

objetos acompañantes deben estar al lado de su objeto real, no lo contiene:

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 

Alternativamente, se puede modificar el alcance de la palabra clave protected para incluir el objeto de cerramiento:

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 

pero aquí no debe nombrar el objeto externo lo mismo que la clase interna o tendrá problemas para referirse a él desde dentro de la clase.

Cuestiones relacionadas