답변:
sealed
특성은 선언과 같은 파일을 확장 할 수 있습니다.
그들은 종종 대안을 제공하는 데 사용됩니다 enums
. 그것들은 단일 파일로만 확장 될 수 있기 때문에 컴파일러는 가능한 모든 하위 유형을 알고 있으며 그것에 대해 추론 할 수 있습니다.
예를 들어 선언 :
sealed trait Answer
case object Yes extends Answer
case object No extends Answer
일치하는 항목이 전부가 아닌 경우 컴파일러에서 경고를 표시합니다.
scala> val x: Answer = Yes
x: Answer = Yes
scala> x match {
| case No => println("No")
| }
<console>:12: warning: match is not exhaustive!
missing combination Yes
따라서 가능한 하위 유형의 수가 유한하고 사전에 알려진 경우 봉인 된 특성 (또는 봉인 된 추상 클래스)을 사용해야합니다. 더 많은 예제를 보려면 목록 및 옵션 구현을 살펴볼 수 있습니다 .
봉인 된 특성은 봉인 된 클래스와 동일합니까?
지금까지로 sealed
간다, 그래. 그들은 사이의 일반적인 차이점을 공유 trait
하고 class
, 물론.
또는 그렇지 않은 경우 차이점은 무엇입니까?
무트.
봉인 된 특성을 사용하는 것이 좋은 생각은 언제입니까?
이 있으면 하위 클래스뿐만 아니라 sealed class X
확인해야합니다 X
. sealed abstract class X
또는의 경우도 마찬가지입니다 sealed trait X
. 그래서 당신은 할 수 sealed abstract class X
있지만, 그것은 단지보다 더 장황합니다.trait
작은 이점 합니다.
abstract class
over a 를 사용하는 주된 장점은 trait
매개 변수를 수신 할 수 있다는 것입니다. 이러한 장점은 형식 클래스를 사용할 때 특히 관련이 있습니다. 예를 들어 정렬 트리를 만들고 싶다고 가정 해 봅시다. 당신은 이것을 쓸 수 있습니다 :
sealed abstract class Tree[T : Ordering]
그러나 당신은 이것을 할 수 없습니다 :
sealed trait Tree[T : Ordering]
컨텍스트 바운드 (및 뷰 바운드)는 암시 적 매개 변수로 구현되기 때문입니다. 특성이 매개 변수를 수신 할 수 없다는 것을 감안할 때이를 수행 할 수 없습니다.
개인적으로, sealed trait
특정 이유로 인해 나를 사용하지 않는 한 선호 하고 사용합니다 sealed abstract class
. 그리고 나는 미묘한 이유에 대해 이야기하는 것이 아니라 타입 클래스 사용과 같이 무시할 수없는 얼굴상의 이유에 대해 이야기하고 있습니다.
[A: F]
)는 분산 제약 조건과 같은 방식으로 작동하지 않습니다. 오히려, 그것은 암시적인 F[A]
범위 를 요구하는 구문 설탕입니다 . 일반적으로 암시 적 매개 변수 ( (implicit fa: F[A])
) 보다 약간 더 깔끔하고 읽기 쉬운 방식으로 유형 클래스 인스턴스를 소환하는 데 사용 되지만 여전히 후드에서 동일한 방식으로 작동하며 Daniel이 지적한 것처럼 특성은 수행 할 수 없습니다. 그.
로부터 매일 스칼라 블로그 :
특성이 "밀봉"되면 모든 서브 클래스가 동일한 파일 내에 선언되고 서브 클래스 세트를 유한하게하여 특정 컴파일러 검사를 허용합니다.
또한 사양을 가리킬 필요가 있다고 생각합니다.
밀봉 수정 된 파이 어은 Fi를 정의들 드 클래스에 적용됩니다. 봉인 클래스는 직접 상속 템플릿을 상속 클래스와 같은 소스 파일에 네드 드 파이 인 경우를 제외하고 상속 할 수 없습니다. 그러나 봉인 클래스의 하위 클래스는 어디에서나 상속 될 수 있습니다.
간단히:
자세한 내용 은 스칼라의 봉인 된 특성에 대한 모든 것