Не удается получить доступ к методу класса companion из объекта companion

Я думал, что могу получить доступ к каждому методу класса companion из моего объекта companion. Но я не могу?

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

что я делаю не так?

3 ответов


вы пытаетесь вызвать метод getTag на object EFCriteriaType. В этом объекте нет такого метода. Вы могли бы сделать что-то вроде:

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

таким образом, делая объект companion своего рода шаблоном.

вы можете получить доступ к членам, обычно недоступным в классе из сопутствующего объекта, но вам все равно нужно иметь экземпляр класса для доступа к ним. Например:

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
}

вот частный метод secret работает с 'товарищ С. Bar не будет компилироваться, так как секрет недоступен.


Я не совсем уверен, что вы пытаетесь сделать здесь, но вам нужно вызвать getTag на экземпляре класса:

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

просто подробно Мэтью ответ, который является правильным:

сопутствующий объект является одноэлементным, но класс-нет. одиночка. Компаньон объект может получить доступ к методам класса, в том смысле, что частная член класса C может быть вызван в его сопутствующем объекте C.

чтобы вызвать члена данного класса, вам нужен экземпляр этого класса (даже если вы не делаете это из сопутствующего объекта)