2010-11-25 1 views
8

이 스칼라 코드가 있다고 가정합니다.중첩 된 컴패니언 개체의 멤버가 클래스에서 자동으로 보이지 않는 이유는 무엇입니까?

object Outer { 

    object Inner { 
    val B = "B" 
    } 
    class Inner { 
    def b = B 
    } 
} 

이 컴파일 할 것으로 예상되지만 Bb의 정의에서 액세스 할 수 없습니다. 작동하도록 class Innerimport Inner._을 추가해야합니다. 왜 그런가요? 컴패니언 개체 Inner이 올바르게 정의되지 않았습니까?

+0

나는이 문제가 새 이민자에게 얼마나 중요한지 보여주는 * 다시 * (잊어 버린 후) * 여기에 왔습니다. 나는 '외부'가 그 질문에 아무런 역할을하지 않는다고 생각한다; 그것 없이도 꽤 똑같습니다. 이 질문에 감사드립니다! – akauppi

답변

6

이 방법으로 작동하지 않아야합니다. import Inner._을 사용하는 것은 일관된 동작입니다.


Java의 정적 멤버와 비슷한 동작을 얻으려면 일반적으로 컴패니언 개체가 필요합니다. 당신은 클래스의 팩토리로서 동반자 객체를 사용할 수 있습니다

object Outer { 

    object Inner { 
    def print(inner: Inner) = inner.B // compiles! 
    }  
    class Inner { 
    private val B = "B" 
    }  
} 

: 스칼라 방법은 동반자 클래스의 개인/보호 된 멤버들 그것에서 액세스 할 수 있다는 장점과 함께, 싱글 톤 객체에 떨어져 모든 정적 멤버를 이동하는 것입니다 개인 생성자 :

scala> object Outer { 
    | 
    | object Inner { 
    |  def newInstance = new Inner() 
    | } 
    | class Inner private() { 
    |  private val B = "B" 
    | } 
    | } 
defined module Outer 

scala> Outer.Inner.newInstance 
res1: Outer.Inner = [email protected] 

scala> new Outer.Inner 
<console>:7: error: constructor Inner cannot be accessed in object $iw 
     new Outer.Inner 
    ^
+0

B를 상수로 정의하고 Outer.Inner 클래스에서 사용하고 Outer.Inner.B로 외부 세계에 액세스 할 수도 있습니다. Inner가 중첩되어 있지 않으면 가져 오기가 필요 없다는 인상하에 있었지만 Outer 클래스를 삭제하면 내 예제가 컴파일되지 않기 때문에 내가 실수했다고 생각합니다. 그래서 베팅 방법은 무엇입니까? 'public static final String B = "B";와 비슷한 상수를 정의하기 위해 Java로 작성하겠습니까? –

+0

문제가 보이지 않음 -> https://gist.github.com/715219 –

+0

OK, 추가 수입이 필요하다는 확인 만 필요했습니다. 그건 나에게 좋았어. 멤버가 동반 오브젝트/클래스에 자동으로 가져 왔다고 생각했습니다. –

11

동반자 개체의 구성원이 클래스로 수입 될 경우, 그것을 CONTROLE 할 수있는 프로그래머없이 클래스의 네임 스페이스를 오염 것입니다. 이것은 값으로는 나쁘지는 않지만 여전히 좋지는 않지만 기능으로는보기 싫을 것입니다.

그냥 apply() 또는 기능 (당신이 뭔가를 잃어 버리지 않고 이름을 바꿀 수없는 두 경우 모두)에서 상속 기능을 생각해보십시오. 이러한 함수가 클래스 네임 스페이스에 자동으로 가져 오는 경우 컴파일러는 사용할 클래스를 알 수 없습니다. 따라서 클래스와 객체에 함수 func()이 있으면 클래스 코드에 this.func()을 쓰면 결국 호출 할 수 있습니다.

네임 스페이스를 깨끗하게 유지할 수있는 가능성을 확인하십시오. import Inner._

+0

왜 가져 오기가 필요한지 정당화. 많은 의미가 있습니다. –

관련 문제