2012-07-27 11 views
6

Pomyślałem, że mogę uzyskać dostęp do każdej metody klasy towarzyszącej z mojego obiektu towarzyszącego. Ale nie mogę?Nie można uzyskać dostępu do metody klasy towarzyszącej z obiektu towarzyszącego

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 
} 

błąd kompilatora: nie znaleziono: wartość getTag

Co robię źle?

+0

Całkowicie zgadzam się z odpowiedzią @MatthewFarwell. Poza tym myślę, że chcesz, aby metoda toString była wewnątrz klasy zamiast obiektu towarzyszącego. – jeslg

Odpowiedz

6

Próbujesz wywołać metodę getTag w object EFCriteriaType. W tym obiekcie nie ma takiej metody. Możesz zrobić coś takiego:

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

Tym samym uczynienie obiektu towarzyszącego rodzajem szablonu.

Możesz uzyskać dostęp do członków, które normalnie nie są dostępne w klasie z obiektu towarzyszącego, ale nadal musisz mieć instancję klasy, aby uzyskać do nich dostęp. Np:

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 
} 

Tutaj metoda secret prywatny jest dostępny z Foo „s towarzysza obiektu. Pasek nie zostanie skompilowany, ponieważ sekret jest niedostępny.

+1

Ok. Myślę, że rozumiem. Potrzebuję instancji klasy towarzyszącej, aby wywołać jej metodę. Jeśli przeniesię metodę _toString_ do klasy towarzyszącej, zadziała. Dzięki! – GarfieldKlon

4

Nie jestem pewien, co starasz się zrobić tutaj, ale trzeba zadzwonić getTag na przykład klasy:

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

Chcę zastąpić metodę _toString_ i po prostu zwróć _tag_. Nie mogę przekazać obiektu doString, bo stanie się przeciążeniem. – GarfieldKlon

1

Wystarczy szczegółowo Matthew odpowiedź, która jest właściwa:

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.

Aby połączyć się z członków danej klasy, trzeba instancję tej klasy (nawet jeśli nie robi, że z osobą towarzyszącą obiekt)

Powiązane problemy