2012-07-27 10 views
6

Ho pensato di poter accedere a tutti i metodi della classe companion dal mio oggetto companion. Ma non posso?Impossibile accedere al metodo della classe companion dall'oggetto associato

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 
} 

errore del compilatore: non trovato: il valore GetTag

Quello che sto facendo di sbagliato?

+0

Sono totalmente d'accordo con la risposta di @MatthewFarwell. Inoltre, penso che vuoi che il metodo toString sia all'interno della classe invece dell'oggetto companion. – jeslg

risposta

6

Si sta tentando di chiamare il metodo getTag in object EFCriteriaType. Non esiste un tale metodo in quell'oggetto. Si potrebbe fare qualcosa del tipo:

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

Così facendo l'oggetto compagno una sorta di modello.

È possibile accedere a membri non normalmente accessibili in una classe da un oggetto associato, ma è comunque necessario disporre di un'istanza della classe per accedervi. Per esempio:

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 
} 

Qui il metodo privato secret è accessibile da oggetto associato Foo s'. La barra non verrà compilata poiché il segreto non è accessibile.

+1

Ok. Penso di capire. Ho bisogno di un'istanza della classe companion per chiamarne un metodo. Se sposto il metodo _toString_ nella classe companion, funziona. Grazie! – GarfieldKlon

4

io non sono abbastanza sicuro di quello che stai cercando di fare qui, ma è necessario chiamare GetTag su un'istanza della classe:

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

Voglio sovrascrivere il metodo _toString_ e semplicemente restituire il _tag_. Non riesco a passare un oggetto a toString, altrimenti diventerà un sovraccarico. – GarfieldKlon

1

Proprio ai dettagli Matthew risposta, che è quella giusta:

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.

Per chiamare un membro di una data classe, è necessario un'istanza di quella classe (anche se non sta facendo che da un compagno oggetto)

Problemi correlati