2012-07-27 11 views
6

Ich dachte, dass ich von meinem Companion-Objekt aus auf alle Methoden der Companion-Klasse zugreifen kann. Aber ich kann nicht?Zugriff auf Methode der Companion-Klasse vom Companion-Objekt aus möglich

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 
} 

Compiler-Fehler: nicht gefunden: Wert

GetTag

Was ich falsch mache?

+0

Ich stimme völlig @ MatthewFarwell Antwort. Außerdem denke ich, dass die toString-Methode innerhalb der Klasse statt des Companion-Objekts sein soll. – jeslg

Antwort

6

Sie versuchen, die Methode getTag in object EFCriteriaType zu nennen. Es gibt keine solche Methode in diesem Objekt. Sie könnten etwas tun wie:

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

So macht das Companion-Objekt eine Art Vorlage.

Sie können auf Member zugreifen, auf die normalerweise in einer Klasse nicht über ein Companion-Objekt zugegriffen werden kann. Sie benötigen jedoch eine Instanz der Klasse, um auf sie zugreifen zu können. Z. B:

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 
} 

Hier ist die private Methode secret von Foo ‚s Begleiter Objekt zugänglich ist. Bar wird nicht kompiliert, da auf das Geheimnis nicht zugegriffen werden kann.

+1

Ok. Ich denke ich verstehe. Ich brauche eine Instanz der Companion-Klasse, um eine Methode dafür aufzurufen. Wenn ich die Methode _toString_ in die Companion-Klasse verschiebe, funktioniert sie. Vielen Dank! – GarfieldKlon

4

Ich bin nicht ganz sicher, was Sie versuchen, hier zu tun, aber Sie müssen getTag auf eine Instanz der Klasse nennen:

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

Ich möchte die Methode _toString_ überschreiben und einfach die _tag_ zurückgeben. Ich kann ein Objekt nicht an toString übergeben oder es wird überladen. – GarfieldKlon

1

Nur zum Detail Matthew Antwort, welche die richtige ist:

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.

Um ein Mitglied einer bestimmten Klasse aufrufen, müssen Sie eine Instanz dieser Klasse (auch wenn Sie nicht, dass von einem Begleiter tun Objekt)

Verwandte Themen