2016-10-02 2 views
4
class EG { 
    private[this] type TypeMember = A 
    private[this] var field: Int = 0 
} 

필드와 마찬가지로 유형 멤버에 대한 액세스 한정자를 지정할 수 있습니다. OOP의 경우 필드의 encapsulation이 의도하지 않은 상태 공유를 방지하고 상태 수정을 제한하는 이점을 제공한다는 것을 잘 이해하고 있습니다. 내가 아는 한 형식 멤버는 스칼라에서만 발견되며 많은 곳에서 멤버로 정의됩니다. 따라서 형식 멤버에서 액세스 한정자를 사용하는 것은 필드의 경우처럼 잘 이해되지 않습니다. 유형 멤버는 변수 또는 필드와 같은 상태를 보유하지 않습니다. 값을 보유하지 않으므로 돌연변이 될 수 없습니다. 내 질문은 형식 멤버 (개인 또는 보호 된 형식 멤버를 정의)에 대한 액세스를 제한해야하는 장소는 무엇입니까? 대신 형의 멤버을 정의 경우타입 멤버에 대한 액세스 한정자는 언제 사용해야합니까?

답변

5

정의를 제공하지 않고 형의 멤버에게 선언 개인을 만들기 만 쓸모뿐만 아니라 컴파일러

scala> class Foo { private[this] type T } 
<console>:11: error: abstract member may not have private modifier 
     class Foo { private[this] type T } 

에 의해 허용되지 있지 않은 경우,이있을 수 있습니다 합법적 인 사용 사례.

예, 개인 형 별명 : 유형 T는 클래스 내부에 존재하는이 경우

trait Foo { 
    private[this] type T = String 
} 

. 구현 컨텍스트에서만 유형에 대해 더 짧은 이름을 제공하는 데 유용 할 수 있습니다.

다른 예는, 대략 동일한 유즈 케이스와 입력 파라미터

trait Foo[Key] { 
    private[this] type K = Key 
} 

개인 네이밍.

보호 설정에 대해서도 의미가 있습니다. 예 : 다음하지 아직 지정된 형식 V 작업 방법으로 구성된 인터페이스를 정의하고

trait Foo { 
    protected[this] type V 

    def foo(v: V): V 
} 

:

class Bar extends Foo { 
    type V = String // actually defining the type 
    def foo(v: V): V = v 
} 
+0

위의 단지 예시적인 목적이다. 이것은 private [This type typeMember = A' 또는 private [this] type TypeMember <: A' 또는'private type TypeMember = A' 또는'protected [this type] TypeMember = A' 또는'protected type TypeMember = A '는 몇 가지 사례를 설명하기위한 것입니다. –

관련 문제