2011-12-19 4 views
3

이를 고려자기 형태로 추상적 인 형태를 고정

object TypeProblem { 

    trait A { 
    type T 
    val set = Set[T]() 
    } 

    trait B { 
    def b() 
    } 

    trait FooBad { this: A => 
    type T <: B 
    def x { 
     set.foreach(_.b()) 
    } 
    } 

    trait FooOk { this: A => 
    type MyT <: B 
    type T = MyT 

    def x { 
     set.foreach(_.b()) 
    } 
    } 

} 

을 컴파일러는 그 값 b는 FooBad.this.T 의 구성원이 아닌 불평 왜 나는 새로운 타입 MYT 및 할당을 정의 FooOk의 작업을 수행 T는 MyT에요?

답변

4

자체 유형 FooBad은 컴파일러에서 FooBad with A으로 확장되므로 (자신이 정의한 멤버에 계속 액세스 할 수 있습니다). 즉, TA의 정의를 얻고, FooBad의 정의는 기대하지 않습니다. 명시 적으로 자신의 유형에 추가 FooBad의 정의를 변경하여 코드를 수정할 수 있습니다 : 그것은 내 신념이다 서브 클래스

trait FooBad extends A { 
    .. 
} 

를 사용하여도

trait FooBad { this: A with FooBad => 
    .. 
} 

이상을 대부분의 경우에 자기 유형해야 일반 서브 클래 싱으로 대체 될 수 있습니다. 이해하기가 더 쉽고, 무서운 것이 아니며 캡슐화가 더 잘됩니다.

+0

도와 드리겠습니다. 하지만 제발 내 이름을 귀하의 의견을 수정하십시오, 첫 글자는 나,하지 않습니다 :-) –

+0

죄송합니다, 율리우스 :) 다시 한번 감사드립니다. –

관련 문제