8

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

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

我做错了什么?

4

4 回答 4

10

您正在尝试调用中的方法getTagobject EFCriteriaType该对象中没有这样的方法。您可以执行以下操作:

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

从而使伴随对象成为一种模板。

您可以从伴随对象访问通常无法在类中访问的成员,但您仍然需要拥有该类的实例才能访问它们。例如:

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可以从Foo的伴生对象访问。Bar 不会编译,因为 secret 是不可访问的。

于 2012-07-27T10:38:00.987 回答
5

我不太确定您要在这里做什么,但是您需要在该类的实例上调用 getTag :

override def toString(x:EFCriteriaType)  = x.getTag
于 2012-07-27T10:27:23.387 回答
4

只是详细说明马修的答案,这是正确的答案:

伴随对象是单例,但类不是。单身人士。伴随对象可以访问类的方法,因为类 C 的私有成员可以在其伴随对象 C 中调用。

要调用给定类的成员,您需要该类的实例(即使您不是从伴随对象执行此操作)

于 2012-07-27T11:10:41.683 回答
1

请按照这个例子:

import scala.math._

case class Circle(radius: Double) {
  import Circle._
  def area: Double = calculateArea(radius)
}

object Circle {
  private def calculateArea(radius: Double): Double = Pi * pow(radius, 2.0)
}

val circle1 = Circle(5.0)

circle1.area
于 2020-11-12T14:59:19.827 回答