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

getTagのメソッドを呼び出そうとしていますobject 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からアクセスできます。Foosecret にアクセスできないため、Bar はコンパイルされません。

于 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 に答える