Не удается получить доступ к методу класса 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.
чтобы вызвать члена данного класса, вам нужен экземпляр этого класса (даже если вы не делаете это из сопутствующего объекта)