无法从伴侣对象访问伴侣类的方法

问题描述:

我认为我可以从我的伴侣对象访问伴侣类的每个方法。但我不能?无法从伴侣对象访问伴侣类的方法

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 
} 

编译器错误: 未发现:价值getTag

我做错了什么?

+0

我完全同意@MatthewFarwell的回应。此外,我认为你希望toString方法在类内,而不是伴随对象。 – jeslg 2012-07-27 11:56:56

您正在尝试调用的方法getTagobject EFCriteriaType。该对象中没有这样的方法。你可以这样做:

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

因此,使伴侣对象的一种模板。

您可以从同伴对象访问类中通常不可访问的成员,但仍需要让该类的实例访问它们。 E.g:

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 
} 

这里私有方法secretFoo的同伴对象访问。由于秘密无法访问,Bar不会编译。

+1

好的。我想我明白。我确实需要一个伴侣类的实例来调用它的一个方法。如果我将_toString_方法移动到伴随班,它会起作用。谢谢! – GarfieldKlon 2012-07-27 12:41:27

我不太清楚你想在这里做什么,而是你需要调用getTag的类的实例:

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

我想重写方法_toString_并简单地返回_tag_。我无法将对象传递给toString,否则它将变成重载。 – GarfieldKlon 2012-07-27 12:30:58

只是细节马修的答案,这是正确的:

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.

要调用给定类中的一员,你需要即使你不这样做,从一个同伴,类(实例对象)