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


332

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

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

답변:


472

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

따라서 가능한 하위 유형의 수가 유한하고 사전에 알려진 경우 봉인 된 특성 (또는 봉인 된 추상 클래스)을 사용해야합니다. 더 많은 예제를 보려면 목록옵션 구현을 살펴볼 수 있습니다 .


113
무작위로 여기에 도착하고 스칼라에서 Java Enum을 대체하는 방법을 이해하는 데 6 개월이 걸렸습니다.
sscarduzio

1
아주 좋은! 유한하고 미리 알려졌을뿐만 아니라 yes (예)와 같은 가능한 모든 하위 유형을 확인하는 것이 제한된 제한된 (밀봉 된) 컨텍스트의 일부입니다. 아니, 심지어 | odd etc ...
Mário de Sá Vera

90

봉인 된 특성은 봉인 된 클래스와 동일합니까?

지금까지로 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. 그리고 나는 미묘한 이유에 대해 이야기하는 것이 아니라 타입 클래스 사용과 같이 무시할 수없는 얼굴상의 이유에 대해 이야기하고 있습니다.


"컨텍스트 경계 (및 뷰 경계)는 암시 적 매개 변수로 구현되므로" -좀 더 자세히 설명해 주시겠습니까?
Ruby

@Ruby – 응답이 꽤 늦었지만 여러분이나 다른 사람이 관심이있는 경우 컨텍스트 경계 ( [A: F])는 분산 제약 조건과 같은 방식으로 작동하지 않습니다. 오히려, 그것은 암시적인 F[A]범위 를 요구하는 구문 설탕입니다 . 일반적으로 암시 적 매개 변수 ( (implicit fa: F[A])) 보다 약간 더 깔끔하고 읽기 쉬운 방식으로 유형 클래스 인스턴스를 소환하는 데 사용 되지만 여전히 후드에서 동일한 방식으로 작동하며 Daniel이 지적한 것처럼 특성은 수행 할 수 없습니다. 그.
mirichan

54

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

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


감사합니다. "모든 서브 클래스"는 클래스와 특성을 의미합니까?
John Threepwood

@John-시도하지는 않았지만 수업이 의심됩니다. 밀봉에 대한 점은 모든 것이 하나의 소스 단위 내에서 정의된다
브라이언 애그뉴을

1
@JohnThreepwood : 클래스, 특성 및 객체. 대부분의 경우 스칼라에서 "클래스"라는 용어는 클래스, 특성 및 객체를 나타내는 데 사용됩니다. 그들 사이의 구체적인 차이점에 대해 이야기 할 때만 클래스 의미 합니다 . SLS는 "템플릿"이라는 용어를 사용하여 클래스와 특성을 모두 나타내지 만 해당 용어는 SLS 외부에서는 많이 사용되지 않으며 세 가지 클래스, 특성 및 개체를 모두 포함하는 용어는 없습니다.
Jörg W Mittag

30

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

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

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


7

간단히:

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.