2011-12-31 3 views
5

다른 패키지에 정의 된 특성을 혼합해야하는 상황에 처해 있습니다. 테스트를 돕기 위해이 특성에서 보호 된 메소드는 패키지 규정이 적용됩니다.다른 패키지의 클래스로 패키지 보호 된 메소드 상속

package A { 
    trait X { 
    protected[A] def method(arg: Int) 
    } 
} 

package B { 
    class Y extends A.X { 
    protected[A] def method(arg: Int) { } 
    } 
} 

2.9.1 수율 scalac 이것을 컴파일 :이 다른 어떤 액세스 개질제 결과에 "보호 된 [A]"클래스 Y 변경

test.scala:9: error: A is not an enclosing class 
    protected[A] def method(arg: Int) { } 

:

다음 예는
test.scala:9: error: overriding method method in trait X of type (arg: Int)Unit; 
method method has weaker access privileges; it should be at least protected[A] 
    override protected def method(arg: Int) { } 

내 질문은 : 특성 X의 정의를 변경할 수 없다고 가정하면, 특성 X를 확장시킬 수있는 클래스 Y에 대한 변경 사항이 있습니까? (일정 수준의 '보호 된'액세스를 유지함)

이럴 수 없다면이 문제를 해결하기위한 다른 권장 설계 전략이 있습니까? ('method'public으로 만드는 것 외)

+0

나는 이것이 설계 상 불가능한 것인지에 대한 간단한 질문에 대답하려고 노력하고있다. 즉 수정해야 할 유일한 (단순한) 방법은 'protected [A]'를 'public'으로 변경하는 것이다. 패키지에 관계없이 액세스 할 수 있어야하는 하위 클래스처럼 보입니다. 안 그래? – nu11ptr

+0

'올바른'해결책은 클래스 Y의 정의를 클래스와 특성으로 분해하는 것입니다. 나는 특성을 A의 하위 패키지에 넣고 거기서 '방법'을 정의한 다음 Y 클래스와 섞을 것입니다. 현실 세계에서 A는 '시장 데이터'이고 B는 '중개인'이므로 의미가 있습니다. 마침내이 기능을 분리하는 데이터 공급자 인 브로커 인스턴스를 마켓 데이터의 하위 패키지에 넣고 혼합합니다. 어쨌든이 두 가지 완전히 다른 관심사이기 때문에 아마도 더 나은 디자인 일 것입니다. 주문 처리 대 시장 데이터). – nu11ptr

답변

2

나는 이것을 어댑터로 해결했다. 원래 특성을 변경할 수는 없지만 동일한 패키지에 다른 특성을 추가 할 수는 있습니다 (그러나 다른 이유로 Y 클래스를 해당 패키지에 넣는 것은 의미가 없습니다). Y 클래스의 'adapterMethod'는 B를 실험으로 패키지화 할 수 있지만, 유스 케이스에서는 필요하지 않을 가능성이 높습니다. 스칼라 2.9.1에서 다음 컴파일은 :

package A { 
    trait X { 
    protected[A] def method(arg: Int) 
    } 

    trait PackageAdapter { 
    protected[A] def method(arg: Int) { adapterMethod(arg) } 

    protected def adapterMethod(arg: Int) 
    } 
} 

package B { 
    class Y extends A.X with A.PackageAdapter { 
    protected[B] def adapterMethod(arg: Int) { } 
    } 
} 

나는이 솔루션에 대해 미친 아니지만, 그렇게 나쁘지 않다. 클래스 Y는 특성 X를 사용하는 클래스의 나머지가 패키지 A에있는 예외적 인 경우입니다 (다른 많은 이유로 클래스 Y는 패키지 B에 있어야합니다). 더 좋은 아이디어?

+0

A에서 B를 파생시킬 수 있습니까? "package A.B {class Y ..."? – TechNeilogy

+0

기술적으로는 그렇습니다. 그러나 A와 B는 서로 관련이 없으며 각 클래스에 많은 클래스가 있기 때문에 다른 많은 이유로 '임의적이며'잘못된 것입니다. 생각해 줘서 고마워. – nu11ptr

+0

업데이트 : 나는 두 개의 pacakages 사이에서 클래스 Y를 분리하여 비슷한 것을 할 것입니다. – nu11ptr

관련 문제