2011-09-28 5 views
11

나는 스칼라의 더 나은 이해를 얻기 위해 노력하고있어, 나는 다음과 같은 코드에 대한 올바른 쓰임새 찾을 수 없습니다 :스칼라에서 익명 형식을 확장하는 목적은 무엇입니까?

class C extends { def m() { /* ... */ } } 

같은 구조를 허용하는 근거는 무엇입니까?

감사합니다.

+2

제공하는 예는 구조 유형이 아니며 익명의 클래스입니다. 그것이 당신이 그것을 확장 할 수있는 이유를 설명하지 않습니다. ... –

+0

맞습니다. 제목을 업데이트했습니다. – Eyvind

답변

12

"가능한 경우 특별한 경우는 피하십시오"라는 유일한 이유가 있다고 생각합니다. 모든 클래스를 확장 할 수 있습니다. 익명 클래스는 클래스이므로 익명 클래스를 확장 할 수 있습니다.

+0

아마 맞을 것입니다 (+1). 실제로 유스 케이스가 있다면 실제 사용 사례를 좋아할 것입니다. – Eyvind

+1

나는 하나가 있다고 생각하지 않습니다 ... –

+0

나는 김에 동의합니다. 상속은 행동을 공유하거나 주어진 계층 구조를 나타냅니다. 그러나 익명의 부모 클래스 인 경우 동일한 부모 클래스를 확장하는 두 개의 하위 클래스를 가질 수 없습니다. – paradigmatic

11

사실, 익명의 클래스가 아닙니다! 초기 이니셜 라이저이며 수퍼 클래스보다 먼저 생성자의 일부로 실행됩니다. 는 another stackoverflow question에서 훌륭한 대답을 인용 :

abstract class X { 
    val name: String 
    val size = name.size 
} 

class Y extends { 
    val name = "class Y" 
} with X 

코드는 다음 널 포인터 예외가 Z가 초기화 도착했을 때 발생할 수있는

class Z extends X { 
    val name = "class Z" 
} 

로 대신 작성된 경우, 크기가 정상에 이름 앞에 초기화되기 때문에 초기화의 순서 (클래스의 전에 슈퍼 클래스).

관련 문제