2011-11-21 5 views
3

Outer 클래스와 그 Inner 클래스의 추상 정의가 주어진다면 구체 Inner1 클래스를 Outer1 특성으로 정의 된 인스턴스로 만들고 싶습니다. 이 Outer1.this.Inner_Tp과의 자기 형 Outer1.this.Inner1을 준수하지 않기 때문에 클래스 Inner1 인스턴스화 할 수 없습니다 : 오류가 "자체 형식의 주석은 내부 클래스의 인스턴스 생성을 방해합니다. 왜?

abstract class Outer { 
    type Inner_Tp <: Inner; 
    abstract class Inner { 
    self: Inner_Tp => 
    } 
} 

trait Outer1 { 
    self: Outer => 
    protected class Inner1 extends Inner { 
    self: Inner_Tp => 
    } 
    def Inner1() = new Inner1() 
} 

는 스칼라 컴파일러는 조기 나에게 다음과 같은 오류 메시지를주고 컴파일을 종료 ". 왜?

결국 Inner1 클래스는 추상 문맥 내에서 Outer1 형질로 정의됩니다. 형질이 어떤 구체적인 클래스에 혼합 될 때까지 type Inner_Tp의 정의를 연기하고 싶습니다.

답변

6

Inner1의 경우 자체 유형은 추상 형식 Inner_Tp과 함께 항상 인스턴스화됩니다. 이는 인스턴스화 시점에서 충족되지 않는 약속입니다. 유형은 Inner1 with Inner_Tp 대신 Inner1입니다.

Inner_Tp의 정의를 지연해야하는 경우 자체 유형으로 인스턴스를 생성하는 것을 지연해야합니다. 그것은 당신이 아직 모르는 타입의 값을 생성 할 수 없으므로 절대적으로 필요합니다. 따라서 메서드 추상을 남기는 것이 좋습니다. 당신은뿐만 아니라 추상 형식 수정 할 수 있습니다

trait Outer1 extends Outer { 
    type Inner_Tp <: Inner1 
    protected class Inner1 extends Inner 

    def Inner1(): Inner_Tp 
} 

당신이 후에 무엇인지 확실하지 않다,하지만 당신은 전혀 자기 유형을 필요로하지 않을 수 있습니다 (I 이미 간결하게 그들을 왼쪽).

1

self: Inner_TpInner의 하위 유형이 Inner_Tp의 하위 유형이 아닌 한 인스턴스를 만들 수 없음을 알리기 때문에

Inner1에 그냥 다시 쓰면 만족스럽지 않습니다. 유사한 아이디어를 얻으려면 추상 클래스의 하위 클래스가있을 때 추상 메소드를 구현하지 않으면 추상 클래스임을 다시 작성해야합니다. 그리고 당신은 instanciate 수 없습니다. 여기에서는 Inner_Tp이 필요하다고 다시 말씀 하셨고 Inner_Tp을 사용할 수 있도록 설정하지 않았습니다.

Inner_Tp이 추상 유형 인 경우이를 혼합 할 수 없으므로 new Inner1을 쓸 수 없습니다. 아마도 Inners를 만드는 추상 메소드를 도입해야 할 것입니다.

+0

Thx 얘들 아, Iulian Dragos의 대답을 대답으로 받아 들였지만, 똑같이 잘 설명해 주었다. 귀하의 회신에 +1하십시오. –

+0

괜찮아요, 율리우스의 명성은 분명히 스칼라의 숙달을 반영하지 않으므로 많은 점수를 받아야합니다 :) –

+0

:-) 감사합니다 얘들 아! –

관련 문제