360

封印されたクラスは「Scala でのプログラミング」で説明されていますが、封印されたトレイトはそうではありません。封印された特性に関する詳細情報はどこで入手できますか?

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

4

6 に答える 6

510

特性は、その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

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

于 2012-06-26T08:55:30.240 に答える
93

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

sealed行く限り、はい。traitもちろん、それらはとの間の通常の違いを共有していますclass

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

駄目だ。

封印された特性を使用するのが良いのはいつですか (そしていつそうでないのですか)?

がある場合は、サブクラスと同様sealed class Xにチェックする必要があります。同じことは、またはXには当てはまりません。だからあなたはすることができますが、それはただよりもはるかに冗長であり、ほとんど利点がありません.sealed abstract class Xsealed trait Xsealed abstract class Xtrait

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

sealed abstract class Tree[T : Ordering]

しかし、これを行うことはできません:

sealed trait Tree[T : Ordering]

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

個人的には、sealed trait何らかの理由でsealed abstract class. そして、私は微妙な理由について話しているのではなく、型クラスを使用するなど、無視できない目の前の理由について話しています。

于 2012-06-26T16:48:33.107 に答える
57

Daily-scala ブログから:

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

于 2012-06-26T08:20:15.967 に答える
30

また、仕様を指摘する必要があると感じています。

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

M. オデルスキー。Scala 言語仕様、バージョン 2.8。オンライン、2013 年 9 月。

于 2013-09-03T15:03:19.347 に答える
9

簡単に言うと:

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

および詳細については 、Scala のシールされたトレイトに関するすべて

于 2018-07-29T18:45:09.120 に答える