나는 스칼라의 더 나은 이해를 얻기 위해 노력하고있어, 나는 다음과 같은 코드에 대한 올바른 쓰임새 찾을 수 없습니다 :스칼라에서 익명 형식을 확장하는 목적은 무엇입니까?
class C extends { def m() { /* ... */ } }
같은 구조를 허용하는 근거는 무엇입니까?
감사합니다.
나는 스칼라의 더 나은 이해를 얻기 위해 노력하고있어, 나는 다음과 같은 코드에 대한 올바른 쓰임새 찾을 수 없습니다 :스칼라에서 익명 형식을 확장하는 목적은 무엇입니까?
class C extends { def m() { /* ... */ } }
같은 구조를 허용하는 근거는 무엇입니까?
감사합니다.
"가능한 경우 특별한 경우는 피하십시오"라는 유일한 이유가 있다고 생각합니다. 모든 클래스를 확장 할 수 있습니다. 익명 클래스는 클래스이므로 익명 클래스를 확장 할 수 있습니다.
아마 맞을 것입니다 (+1). 실제로 유스 케이스가 있다면 실제 사용 사례를 좋아할 것입니다. – Eyvind
나는 하나가 있다고 생각하지 않습니다 ... –
나는 김에 동의합니다. 상속은 행동을 공유하거나 주어진 계층 구조를 나타냅니다. 그러나 익명의 부모 클래스 인 경우 동일한 부모 클래스를 확장하는 두 개의 하위 클래스를 가질 수 없습니다. – paradigmatic
사실, 익명의 클래스가 아닙니다! 초기 이니셜 라이저이며 수퍼 클래스보다 먼저 생성자의 일부로 실행됩니다. 는 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"
}
로 대신 작성된 경우, 크기가 정상에 이름 앞에 초기화되기 때문에 초기화의 순서 (클래스의 전에 슈퍼 클래스).
Early definitions이라고하며 슈퍼 클래스 초기화 순서 문제를 다룹니다.
제공하는 예는 구조 유형이 아니며 익명의 클래스입니다. 그것이 당신이 그것을 확장 할 수있는 이유를 설명하지 않습니다. ... –
맞습니다. 제목을 업데이트했습니다. – Eyvind