制限することで、継承先クラスの一覧を静的に取得できるようにする機能です。欠点として度々指摘される分岐の実装漏れが未然に防げるようになっています。sealedタイプの場合はこのような型による分岐によっていわゆる論理和型を実現するための手段としてしばしば利用されます。今回は、このような論理和型の実装方法として2つのパターンを比較検討したいと思います。修飾子を使った論理和型として表現されるクラスやインターフェースを「親の型」、それらの個々の具体例となるクラスを「子の型」と呼ぶことにします。ポリモーフィズム形式の実装1つ目は、通常の抽象クラスやインターフェースの場合と同じように、子の型に親の型を直接実装させるパターンです。これを「ポリモーフィズム形式の実装」と呼ぶことにします。VehicleTicketポリモーフィズム形式の実装の利点ポリモーフィズム形式の実装の主な利点は、メソッドの引数などで指定された型の抽象度が変わっても、同じ渡し方ができる点にあるでしょう。変数をそのまま渡すことができます。インターフェースにして、抽象化のレイヤーを増やしたとしても、それはクラスの使い方に影響を与えず、上記のコードはそのまま使うことができます。220)buyVehicleTicket(ticket)buyTrainTicket(ticket)ポリモーフィズム形式の実装の欠点ポリモーフィズム形式の実装では、親の型を子の型がsealedタイプを使った形で継承する必要がある点が、実装上の大きな制約となります。これは、継承によって子の型から親の型への依存関係が発生することだけでなく、sealedタイプの制約として、両者が同じモジュールに存在しなければならないことも意味します。どちらかをとる型を定義したい場合、これらのクラスには新たなインターフェスを実装させることはできないので、ポリモーフィズム形式の実装以外の方法を選択する必要があります。インターフェースを定義するというモジュール分割ができなくなります。代数的データ型形式の実装2つめのパターンは、親の型の定義にネストする形で子の型をラップするクラスを定義し、そのラッパークラスに親の型を継承させる形式です。それぞれのラッパークラスが親の型のコンストラクタ関数のように見える書き方になるので、これを「代数的データ型形式の実装」と呼ぶことにします。Int,)代数的データ型形式の実装の利点この形式での大きな利点は、子の型の定義に手を加えることなくに論理和型を実現できることです。どちらかをとる型」も、代数的データ型形式で実装すれば、次のような形で実現できます。DateOrTime}また、依存関係の整理も行いやすく、代数的データ型形式で実装すれば子の型から親の型への直接の依存は無くなるので、前述の例の「バスモジュールと電車モジュールと切符モジュールへの分割」も問題無く実現できるでしょう。上記の例のように、各ラッパークラスが子の型を直接プロパティとして持つ形にすれば、切符モジュールがバスモジュールと電車モジュールに依存する形になります。次の例のように、間にsealedではないインターフェースを設ければ依存関係が逆転し、バスモジュールと電車モジュールが切符モジュールに依存する形になります。代数的データ型形式の実装の欠点は基本的に、ポリモーフィズム形式の実装の利点の裏返しです。代数型データ型形式で実装した場合は、メソッド等がどの抽象度の型を要求しているかによって渡し方を変える必要があります。220))buyBus(busVehicleTicket.value)この不便さは型の階層が深くなるほど大きくなります。2段階のラップが必要この煩わしさは論理和型を利用する側でも発生し、例えば型判定するためのwhen節もフラットに書くことができず、型定義の階層関係に合わせてネストを深くする必要があります。}}まとめこれらの特性を考えると、両者の使い分けに関して次のような指針を立てることができるでしょう。ポリモーフィズム形式の実装を使う。論理和型の扱う範囲が全てモジュール境界の内側に収まるのならポリモーフィズム形式の実装を使い、モジュール境界を超えるならば代数的データ型形式の実装を使う。これはあくまで指針であり、個々のケースはこれ以外の要件も含めて「要はバランス」で考えていく必要があります。この2つのパターンがあることを知っておくことで取れる選択肢は増え、豊かな表現力のコードの実現に役立つことでしょう。hiring!株式会社ドワンゴの教育事業では、一緒に未来の当たり前の教育をつくるメンバーを募集しています。カジュアル面談も行っています。お気軽にご連絡ください!バックエンドチームでは、特にKotlinで型を活用したサーバーアプリを作りたいメンバーを積極募集中です!カジュアル面談応募フォームはこちらwww.nnn.ed.nico開発チームの取り組み、教育事業の今後については、他の記事や採用資料をご覧ください。(3)引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。