2012-07-27 11 views
6

コンパニオンオブジェクトのコンパニオンクラスのすべてのメソッドにアクセスできると思っていました。しかし、私はできない?コンパニオンオブジェクトからコンパニオンクラスのメソッドにアクセスできません

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

答えて

6

あなたはobject EFCriteriaType方法getTagを呼び出そうとしています。そのオブジェクトにはそのようなメソッドはありません。

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 
} 

プライベートメソッドsecretFooのコンパニオンオブジェクトからアクセス可能です。秘密にアクセスできないので、バーはコンパイルされません。

+1

分かったと思います。私はそのメソッドを呼び出すためにコンパニオンクラスのインスタンスが必要です。私が_toString_メソッドをコンパニオンクラスに移動すると、それは機能します。ありがとう! – GarfieldKlon

4

私はあなたがここで何をしようとしてはかなりわからないんだけど、あなたはクラスのインスタンスでのgetTagを呼び出す必要があります:

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

メソッド_toString_をオーバーライドして、_tag_を返すだけです。私はオブジェクトをtoStringに渡すことはできません、またはそれはオーバーロードになります。 – GarfieldKlon

1

ちょうどいいです詳細マシューの答えに:あなたは仲間からそれをやっていない場合であっても

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.

与えられたクラスのメンバーを呼び出すには、(そのクラスのインスタンスが必要オブジェクト)

関連する問題