2012-07-27 2 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 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의 전화를해야합니다 당신은 object EFCriteriaType의 방법을 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.

가 주어진 클래스의 멤버를 호출하려면, 당신은 당신이 동료에서 것을하고 있지 않은 경우에도 그 클래스 (의 인스턴스를 필요 개체)

관련 문제