2014-09-04 4 views
1

에서 구상 서브 클래스에서 구현 될 나는 나의 특성이 특징

def controller: AnyRef 

의 방법을 가지고 있지만 내 구체적인 클래스는 그 메소드를 구현되지 않았고 여전히 컴파일했다. 컴파일러는 해당 메소드에 추상을 추가하지 않습니다. 어떻게 특성을 구현하는 사람이 그것을 구현할 수있는 방법을 만들 수 있습니까?

덕분에, 딘

+0

특성을 확장하는 클래스가 추상화되어 있습니까? –

+0

예. 알아 냈습니다. 구체적인 하위 클래스에는 val controller = new Controller가 있으며, 그럴 때, 어떤 이유로 인해 trait 메소드에서 controller를 호출하면 null이 반환됩니다. 나는 아래에 진정한 대답을 추가했다. (그렇다면 그것이 컴파일 된 이유에 대한 새로운 질문이있다.) –

답변

5

컴파일러는 구체적인 클래스들이 상위 클래스와 특성에서 상속 모든 초록 방법을 구현하는 것이 적용합니다.

클래스를 컴파일하는 것이 구체적이지 않다는 의미, 즉 trait 또는 abstract class이었으며 추상 메소드 구현을 강제 할 수 없습니다.

물론 구체적인 인스턴스를 얻으려고하면 컴파일러에서 메서드가 구현되지 않으므로 오류가 발생합니다. REPL

scala> trait A { def controller: AnyRef } 
defined trait A 

scala> trait B extends A 
defined trait B 

scala> abstract class C extends A 
defined class C 

scala> class D extends A 
<console>:8: error: class D needs to be abstract, since method controller in trait A of type => AnyRef is not defined 
     class D extends A 

scala> new B { } 
<console>:10: error: object creation impossible, since method controller in trait A of type => AnyRef is not defined 
       new B { } 
       ^

scala> new C 
<console>:10: error: class C is abstract; cannot be instantiated 
       new C 
+0

아, 나는 추상적 인 메소드와 실행으로 컴파일해야한다고 맹세 할 수 있었고, 내 경우에는 null을 리턴했다. 그러나 어떤 이유로 오늘은 재현 할 수 없다. 그 : –

+0

지금은 그것을 재현 할 수 있습니다. 구체적인 하위 클래스에서 Val 컨트롤러 = 새로운 TheController() 및이 경우 특성을 컨트롤러를 호출 할 때 null 반환하는 끝납니다.이 스칼라 버그 것 같습니다 –

+0

아마 초기화 문제 일 겁니다. 구체적인 문제에 대한 새로운 질문을 열어야합니다. 예를 들어, val controller = new Controller로 콘크리트 서브 클래스를 작성하면 –

1

당신이이 경우에 대한 컴파일 오류가 발생하지 않는 경우에

실제 예를 들어, 내가 프로젝트를 청소/새로 고침을 시도하여 IDE 몇 가지 문제가있다 생각합니다.

특성에 "컨트롤러"기능 구현이있는 경우 특성을 확장하는 구체적인 클래스 (비 추상 클래스)는 이 아니고은 "컨트롤러"기능을 구현해야합니다. 스칼라에서는이라는 특성의 아름다움이 입니다. 모든 구체적인 클래스가 같은 구현으로 몇 가지 일반적인 메서드를 구현하지 않아도됩니다.

+0

이 출력됩니다. !!! 컨트롤러 대신 null을 반환합니다. –

0

글쎄, 거기에 이상한 scala 문제가 발생하는 것 같습니다.

당신은 형질 컨트롤러와 널 (null)에 형질 전화 컨트롤러 결과를 갖는 반환에 영향을 미치는 것으로 보인다

val controller = new Controller 

을 가지고 구상 서브 클래스가있을 때. 모든 것이 잘 컴파일됩니다 (실제로 컴파일해야한다고 생각하지는 않지만 스칼라 버그라고 생각합니다).

컴파일해야하는 경우 누군가 컴파일 할 이유를 설명해주십시오.