[scala] 봉인 된 특성은 무엇입니까?

봉인 된 클래스는 ‘스칼라 프로그래밍’에 설명되어 있지만 봉인 된 특성은 없습니다. 봉인 된 특성에 대한 자세한 정보는 어디서 찾을 수 있습니까?

봉인 된 특성이 봉인 된 클래스와 같은지 알고 싶습니다. 아니면, 차이점이 무엇입니까? 봉인 된 특성을 사용하는 것이 좋은 생각은 언제입니까?



답변

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 classover a 를 사용하는 주된 장점은 trait매개 변수를 수신 할 수 있다는 것입니다. 이러한 장점은 형식 클래스를 사용할 때 특히 관련이 있습니다. 예를 들어 정렬 트리를 만들고 싶다고 가정 해 봅시다. 당신은 이것을 쓸 수 있습니다 :

sealed abstract class Tree[T : Ordering]

그러나 당신은 이것을 할 수 없습니다 :

sealed trait Tree[T : Ordering]

컨텍스트 바운드 (및 뷰 바운드)는 암시 적 매개 변수로 구현되기 때문입니다. 특성이 매개 변수를 수신 할 수 없다는 것을 감안할 때이를 수행 할 수 없습니다.

개인적으로, sealed trait특정 이유로 인해 나를 사용하지 않는 한 선호 하고 사용합니다 sealed abstract class. 그리고 나는 미묘한 이유에 대해 이야기하는 것이 아니라 타입 클래스 사용과 같이 무시할 수없는 얼굴상의 이유에 대해 이야기하고 있습니다.


답변

로부터 매일 스칼라 블로그 :

특성이 “밀봉”되면 모든 서브 클래스가 동일한 파일 내에 선언되고 서브 클래스 세트를 유한하게하여 특정 컴파일러 검사를 허용합니다.


답변

또한 사양을 가리킬 필요가 있다고 생각합니다.

밀봉 수정 된 파이 어은 Fi를 정의들 드 클래스에 적용됩니다. 봉인 클래스는 직접 상속 템플릿을 상속 클래스와 같은 소스 파일에 네드 드 파이 인 경우를 제외하고 상속 할 수 없습니다. 그러나 봉인 클래스의 하위 클래스는 어디에서나 상속 될 수 있습니다.

M. Odersky. 스칼라 언어 사양, 버전 2.8. 2013 년 9 월 온라인.


답변

간단히:

  • 봉인 된 특성은 동일한 파일에서만 확장 할 수 있습니다
  • 컴파일러가 가능한 모든 하위 유형을 쉽게 알 수 있도록 나열합니다.
  • 가능한 서브 타입의 수가 유한하고 사전에 알려진 경우 밀봉 된 특성을 사용하십시오.
  • Java에서 enum과 같은 것을 만드는 방법
  • 대수 데이터 형식 (ADT)을 정의하는 데 도움이됩니다.

자세한 내용
은 스칼라의 봉인 된 특성에 대한 모든 것


답변