2012-07-27 21 views
6

Pensé que podía acceder a todos los métodos de la clase complementaria desde mi objeto compañero. Pero no puedo?No se puede acceder al método de la clase complementaria del objeto complementario

class EFCriteriaType(tag:String) extends CriteriaType 
{ 
    // implemented method of CriteriaType 
    def getTag = this.tag 
} 

object EFCriteriaType 
{ 
    var TEXT: CriteriaType = new EFCriteriaType("text") 

    override def toString = getTag 
} 

de error del compilador: no encontrado: valor GetTag

Lo que estoy haciendo mal?

+0

Estoy totalmente de acuerdo con @MatthewFarwell respuesta. Además, creo que quieres que el método toString esté dentro de la clase en lugar del objeto complementario. – jeslg

Respuesta

6

Usted está tratando de llamar al método getTag en object EFCriteriaType. No hay tal método en ese objeto. Podría hacer algo como:

object EFCriteriaType extends EFCriteriaType("text") { 
    override def toString = getTag 
} 

Haciendo del objeto complementario una especie de plantilla.

Puede acceder a los miembros a los que normalmente no se puede acceder en una clase desde un objeto complementario, pero aún necesita tener una instancia de la clase para acceder a ellos. Por ejemplo:

class Foo { 
    private def secret = "secret" 
    def visible = "visible" 
} 
object Foo { 
    def printSecret(f:Foo) = println(f.secret) // This compiles 
} 
object Bar { 
    def printSecret(f:Foo) = println(f.secret) // This does not compile 
} 

Aquí el método privado secret es accesible desde objeto acompañante Foo 's. Bar no compilará porque el secreto es inaccesible.

+1

Ok. Creo que entiendo. Necesito una instancia de la clase acompañante para llamar a un método. Si muevo el método _toString_ a la clase complementaria, funciona. ¡Gracias! – GarfieldKlon

4

no estoy muy seguro de lo que estamos tratando de hacer aquí, pero hay que llamar getTag en una instancia de la clase:

override def toString(x:EFCriteriaType) = x.getTag 
+0

Quiero sobrescribir el método _toString_ y simplemente devolver el _tag_. No puedo pasar un objeto a toString, o se convertirá en una sobrecarga. – GarfieldKlon

1

Sólo al detalle Mateo respuesta, que es la correcta:

A companion object is a singleton but a class is not. a singleton. The companion object can access the methods of the class in the sense that a private member of the class C can be called in its companion object C.

Para llamar a un miembro de una clase dada, se necesita una instancia de esa clase (incluso si usted no está haciendo que a partir de un compañero objeto)

Cuestiones relacionadas