クラスCompileResult
を作成したいと思います。これはEither型のように扱うことができますが、いくつかの便利なメソッドが追加されています。 CompileSuccess
またはCompileFailure
である必要があります(これらにも拡張機能がいくつかあります)。ただし、Either
はabstract class
であり、拡張したくないため、委任を使用してEither
を内部に格納しているため、これを行うことはできません。
だから私の質問は、なぜEither
が抽象クラスになっているのか(また、なぜ以前の特性だったのか)、なぜインターフェースを使用しなかったのですかオプションについても同様です。
Either
への変更は、2008年4月24日に commit c0b21797bde81861305dd68853add2d8bd46e484 "isLeftとisRightを変更してメモリ使用量を減らしました。" :
IsLeftとisRightを変更して、メモリ使用量を減らしました。
完全なチェックを可能にするために、密封された特性から密封された抽象クラスに変更されました。
#797 のディスカッションごとのすべての変更。
参照されているバグレポートは SI-797 "どちらか一方の遅延値はおそらくdefsである必要があります" :
これは David R. MacIverによるコメント :
私が提案している間、どちらかがシールされた抽象クラスで、パターンマッチの警告が表示されるようにした方がいいのではないでしょうか。
その間、Scala実際にはdoesはsealed trait
sとsealed abstract class
es、これはもう必要ありませんが、これもあります Geoffrey Alan Washburnによるコメント :
左と右が最終的なものであることを考えると、誰かがEitherをミックスインとして使用することができる賢明な方法を私は見ることができません。
したがって、Either
がtrait
でないことは、依然として意味があります。
Option
については、2006年3月9日の commit 0bef86d8e8b7ea7ebb790ebcec7fedcb9a24f5a8 ではsealed
でしたが、それ以前はabstract class
でした。
trait
からabstract class
への変更は、2006年3月3日に commit d7007f7a9607481eb73b8df587e3c52cf4272147 "Use 'mixin class'ではなく 'trait'"を使用 で行われました。
なぜそれらがインターフェースではないのかについては、その答えはかなり単純です:Scalaにはインターフェースがありません。少なくともJavaの意味では、またはC#。