scala/trait v. abstract class
#scala
ScalaにはOOPで抽象化するための道具としてtraitとabstract classとが用意されている
どっちがどっち?となりがちなので説明しておく
ワンポイントメルト
基本的にtraitでいいと思う
ちなみにScalaではフィールドもオーバーライドできるぞ!
Javaだとできないみたい
trait
実装や抽象化をまとめられる道具
traitは実装を分割する道具としても使えるし、実装すべきインターフェイスを表現する道具としても使える
柔軟
クラスは複数のtraitを継承できる
昔のtraitはコンストラクタを持てなかったが、今は持てる(SIP-25がScala 3.0で実装されたため)
code:scala
trait T(n: Int):
def getN = n
class C extends T(42)
C().getN // => 42
cf. https://gist.github.com/gakuzzzz/10081860
abstract class
Javaのそれと互換
互換性が欲しい場合はうれしい
クラスがabstract classを継承(実装)するとき、1つのabstract classだけから継承できる
abstract class A と abstract class B の両方を継承、はできない
Further reading
Scala Traits vs. Abstract Classes | Baeldung on Scala