web-dev-qa-db-ja.com

アザラシとは何ですか?

封印されたクラスは 'Programming in Scala'で説明されていますが、封印された特性はそうではありません。封印された特性に関する詳細な情報はどこにありますか?

封印された特性が封印されたクラスと同じであれば、私は知りたいですか?そうでない場合、違いは何ですか?封印された特性を使用するのが良い場合がありますか(そうでない場合)。

314
John Threepwood

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

そのため、可能なサブタイプの数が有限で事前にわかっている場合は、密封された特性(または密封された抽象クラス)を使用する必要があります。他の例については、 listoption の実装を見てください。

436
paradigmatic

封印された特性は封印されたクラスと同じですか?

sealedに関する限り、そうです。もちろん、それらはtraitclassの通常の違いを共有します。

そうでない場合、違いは何ですか?

おたふく。

封印された特性を使用するのが良い場合がありますか(そうでない場合)。

あなたがsealed class Xを持っているなら、あなたはXと同様にあらゆるサブクラスをチェックしなければなりません。 sealed abstract class Xsealed trait Xについても同じことは言えません。 sealed abstract class Xを実行することもできますが、それは単なるtraitよりも冗長であり、ほとんど利点がありません。

traitよりabstract classを使用する主な利点は、パラメータを受け取ることができるということです。この利点は、型クラスを使用するときに特に関係があります。たとえば、ソートツリーを構築したいとしましょう。あなたはこれを書くことができます:

sealed abstract class Tree[T : Ordering]

しかし、これはできません。

sealed trait Tree[T : Ordering]

コンテキストの境界(およびビューの境界)は暗黙のパラメータで実装されているからです。特性がパラメータを受け取れないことを考えると、それはできません。

個人的には、私はsealed traitを好み、特別な理由でsealed abstract classを使わない限りそれを使います。微妙な理由については話していませんが、タイプクラスを使用するなど、無視できないような理由があります。

86

daily-scalaブログ から:

特性が「封印」されると、そのすべてのサブクラスが同じファイル内で宣言され、それによってサブクラスのセットが有限になり、特定のコンパイラチェックが可能になります。

52
Brian Agnew

また、私はあなたが仕様を示す必要があると感じます:

シール修飾子はクラス定義に適用されます。継承テンプレートが継承クラスと同じソースファイルで定義されている場合を除き、シールクラスは直接継承できません。ただし、シールされたクラスのサブクラスはどこにでも継承できます。

- M。Odersky。Scala言語仕様、バージョン2.8、オンライン、2013年9月

27
A T

簡単に言えば:

  • 封印された特性は同じファイルでのみ拡張できます
  • これをリストすると、コンパイラはすべての可能なサブタイプを簡単に知ることができます。
  • 潜在的なサブタイプの数が有限で事前にわかっている場合は封印された特性を使う
  • Javaでenumのようなものを作成する方法
  • 代数データ型(ADT)の定義に役立ちます

そして詳細については Scalaの封印された特性に関するすべて

3
Majid Hosseini