2014-01-05 6 views
6

다양한 서브 클래스로 구현할 수있는 foo 추상 클래스 (이 특별한 경우에는 특성)가 있습니다. 특정 패키지에 사용하기 위해 직각 서브 클래스를 만들고 싶습니다. bar 패키지를 추가합니다. 정보. 가장 좋은 방법은 상속보다 composition (wrapping) 방법 인 것 같습니다. 그렇지 않으면 foo -package 하위 클래스의 패키지 별 버전을 선언해야하기 때문입니다.작곡을 허용 할 때 스칼라에서 보호 된 메서드를 선언하는 관용적 방법?

package foo { 
    trait Foo { 
    protected def bar: Int 
    } 
} 

package bar { 
    import foo.Foo 
    class Baz 
    class WrapFoo(wrapped: Foo) extends Baz with Foo { 
    protected def bar = wrapped.bar 
    } 
} 

이 오류에 이르게 : :하지만이 전달 될 필요가 보호 된 멤버에 문제가 리드

~/test/scala 14:54 152272% scalac testprotected.scala 
testprotected.scala:11: error: method bar in trait Foo cannot be accessed in foo.Foo 
Access to protected method bar not permitted because 
prefix type foo.Foo does not conform to 
class WrapFoo in package bar where the access take place 
    protected def bar = wrapped.bar 
           ^
one error found 

에도 WrapFoo하지만이 Foo의 서브 클래스, 스칼라는 좋아하지 않는다 wrapped.bar으로 전화하십시오. 나는 WrapFoo 유형의 객체가 wrapped의 하위 객체가 아니기 때문에 이것이라고 생각합니다.

질문은 다음과 같습니다. bar에 대한 보호를 선언하는 관용적 인 방법은 무엇입니까? bar 함수는 공개적으로 사용하지 않고 Foo의 다른 함수에서 호출 할 수 있습니다. 스칼라는 표현적인 보호 시스템을 가지고 있지만 이해가되지 않습니다. 이것이 가능합니까?

답변

1

두 유형을 공통 패키지에 배치하면 패키지 계층 구조의 어느 곳에서나 사용할 수 있으며 직접 상위 요소 일 필요는 없습니다.

그런 다음 protected[packagename] 또는 private[packagename]을 사용하여 액세스를 선택적으로 제어 할 수 있습니다.

+0

유일한 방법입니까? 필자의 경우에는 전체 프로그램에서 코드에 액세스 할 수있게하는 효과가 있습니다. 패키지 레이아웃은 이미 오랫동안 확립되어 있으며이를 위해 다시로드하는 것은 다른 많은 것들을 엉망으로 만들 것입니다. –