2011-11-28 4 views
1

내부 클래스 메서드 및 생성자의 개인 주석에 어려움이 있습니다.내부 클래스의 프라이버시 및 외부 형식의 부속 유형에서 액세스 가능성

trait A { 
    class Lala protected() 
} 

trait B extends A { 
    new Lala 
} 

을 어느 쪽이 수행합니다 :

trait A { 
    protected def lala =() 
} 

trait B extends A { 
    lala 
} 

다음은하지하지 않습니다 :

object Screwed { 
    trait A { 
    class Lala private[Screwed]() 
    } 

    trait B extends A { 
    new Lala 
    } 
} 
:

trait A { 
    class Lala private[A]() 
} 

trait B extends A { 
    new Lala 
} 

유일한 방법은 주위에 같은 뭔가를이 예상대로 작동하지만

스칼라가 실제로 여기에서 실패합니까? o 명확한 메커니즘을 제공합니까? 아니면 제가 누락 된 것이 있습니까? 내 생각 엔 private[this.type]이되어야하지만 scalac은 그걸 전혀 삼키고 싶지 않았을 것입니다 ...

답변

6

음,

trait A { 
    class Lala protected() 
    new Lala 
} 

중 하나를 컴파일되지 않습니다. 오류 메시지는 매우 합리적인 것처럼 보입니다.

error: constructor Lala in class Lala cannot be accessed in trait A 
Access to protected constructor Lala not permitted because 
enclosing class trait A in object $iw is not a subclass of 
class Lala in trait A where target is defined 

보호 된 액세스는 해당 클래스 또는 하위 클래스에서만 해당 생성자에 액세스 할 수 있음을 의미합니다. 당신은 둘러싸는 형질로부터 그것을 부르려고합니다. 당신이 할 수있는 한가지는 다음과 같습니다.

trait B extends A { 
    class Gaga extends Lala 
    new Gaga 
} 

유사한 이유로 제 3의 예가 컴파일되지 않을 것입니다.

보호 된 생성자와 protected class의 차이점에 유의하십시오. 그래서 예를 들면 :이 또한 원하는 가시성와 함께 작동

trait A { 
    protected class P 
    class U // unprotected 
} 

class B extends A { 
    new P // OK 
    new U // OK 
} 

val b = new B 
new b.P // error 
new b.U // OK 
+0

실제로 '보호 된 클래스'는 나를 위해 작동하는 해결책입니다. –

0

확실히 보호해야합니다. 어떤 오류가 발생합니까? 비공개의 경우, 정의한 범위가 가시성을 제어합니다 (따라서 A 특성을 볼 때 A의 가시성을 부여하면 B에서 눈에 띄지 않습니다). 마지막 예제에서 범위를 Screwed로 지정 했으므로 Screwed 내부의 모든 항목이 개인 클래스를 볼 수 있습니다. btw, 더 쉽게 읽을 수 있도록 코드 줄의 첫 번째 항목으로 액세스 한정자를 작성하는 것을 선호합니다.

어떤 스칼라 버전을 사용하고 있으며 "작동하지 않음"이란 무엇을 의미합니까?

HTH!

+0

'오류 : 클래스 Lala의 생성자 Lala는 특성 B에서 액세스 할 수 없습니다. ' Luigi가 지적한 것처럼'protected '는'A'가 아닌'Lala'의 범위를 가리키며 __A 나 A__의 하위 유형에 대한 가시성을위한 가능한 범위가없는 것 같습니다. 저는 이것을 사적인 [A] 또는 적어도 보호 된 [A]에게서 얻을 것이라고 예상했습니다. –

+0

@Sciss 아마도 '보호 된 클래스'가 필요할까요? 내 대답을 업데이트했습니다. –

+0

감사합니다 루이지, 나는 '보호 된'내부 클래스의 인스턴스를 리턴하는 것이'Lala'가 문맥을 벗어나서 문제를 일으킨다 고 생각했지만, 당신이 옳았다. –

1

(LalaA 또는 A의 서브 타입에서 인스턴스화 할 수있다).

trait A { 
    class Lala private[A]() 
    protected def newLala = new Lala 
} 

trait B extends A { 
    newLala 
} 

나는 그것이이 경우 작동하지 않는 경우 protected[A] 같은의 목적이 무엇인지 궁금합니다.

관련 문제