2017-06-15 5 views
-1

sealed修飾子の使用について少し混乱しています。Kotlinで密封された修飾語は何を表していますか?

どうしますか?この修飾子は、主に使用され

+0

てみ[このリンク](https://kotlinlang.org/docs/reference/sealed-classes.html)でこれについての詳細を読むことができます - 'sealed'キーワード、限りクラスクラスのすべてのサブクラスが同じファイルにあり、スーパークラスにネストされていることを確認します。 – josephmbustamante

+2

文書について不明な点は何ですか? – nhaarman

答えて

3

あなたはサブクラスを作成する可能性を制限したいとき、それはすべての直接のサブクラスを入れ子にする必要がある意味、これは一例です:だから

sealed class Animal { 
    class Cow(val name: String) : Animal() 
} 

//It generates a compilation error 
class Horse : Animal() { 
} 

sealedクラスが相続を持つことができませんクラス外。

+5

これは完全ではありません。Kotlin 1.1では制限が解除され、サブクラスは 'sealed'クラスの外に置くことができますが、同じファイルに配置する必要があります。 – hotkey

+0

また、この制限の利益は何かを言及する価値があります。コンパイラは 'when'ステートメントがその枝にすべてのサブタイプをリストアップしていることを確認できるので、' else'ブランチは必要ありません。 – hotkey

+1

> = 1.1のREPLでは、サブクラスはまだ内部にネストされていなければなりません – shanethehat

6

official docsがこれをカバーします。

封印されたクラスは、継承階層が制限されています。その中で宣言されているか、(Kotlin 1.1以降の)同じファイルにあるクラスのみが封印されたクラスのサブクラスです。

これは、when式と組み合わせて使用​​すると便利です。これにより、ブランチが密封されたクラスの可能なサブクラスを徹底的にチェックすることが保証されます。

2

他の答えは良いですが、重要な点は追加する価値があると思います:密閉されたクラスのサブクラスを拡張するクラスは、必ずしも同じファイルにではなく、どこにでも配置できます。密封されたクラスは、すべてのサブクラスもsealedでない限り、必ずしも継承階層全体が同じファイル内にあるわけではないので、注意することは重要です。

あなたはthe official docs for sealed classes.

関連する問題