【Scala】Scala ~ 基本編 / トレイト ~

■ はじめに

https://dk521123.hatenablog.com/entry/2023/03/14/000857

で、Scala の クラスについて扱ったが
今回は、トレイト - Trait について学ぶ

cf  trait = (人・ものの)特性、特色、特徴

目次

【1】トレイト - Trait
 1)Java との違い
 2)用語整理:ミックスイン(Mix-in)とは?
 3)使用上の注意
【2】構文
【3】サンプル
【4】トレイト or 抽象クラス

【1】トレイト - Trait

* 機能を切りだして、再利用可能な塊にしたモノ
 => Java の interface のようなもの

cf. trait = 特性, 特徴, 形質

https://scala-text.github.io/scala_text/trait.html

1)Java との違い

* 実装コードを持たせることができる
* トレイルのインスタンス化も無名クラスを使って可能

2)用語整理:ミックスイン(Mix-in)とは?

* クラスがトレイトを継承すること

 => interface でいう、「実装する」もしくは「インプリメントする」が
 => trait では、「ミックスインする(Mix-in)」

3)使用上の注意

* クラスパラメータ(コンストラクタの引数)を取ることができない
* 通常クラスのようにコンストラクタを持つことはできない

【2】構文

* traitキーワードで定義

trait の 定義

trait <トレイト名> {
  (<フィールド定義> | <メソッド定義>)*
}

trait の ミックスイン(別クラスを継承していない場合)

class <クラス名> extends <トレイト名1> with <トレイト名2>, <トレイト名3>, .... {
  // クラスの内容
}

trait の ミックスイン(別クラスを継承している場合)

class <クラス名> extends <別クラス名1> with <トレイト名1>, <トレイト名2>, <トレイト名3>, .... {
  // クラスの内容
}

【3】サンプル

trait Person {
  val name: String
  def sayHello(): Unit = print()
}

【4】トレイト or 抽象クラス

* トレイトを使うべきか、抽象クラスを使うべきか
 どちらを使うかの指針的なことをメモ

抽象クラスを使った方がいいケース

* Javaコードで継承できるようにしたい場合
* ライブラリとしてコンパイル後に配布して
 そのライブラリを外部開発者が継承して使う場合
* 1クラスに対して継承させることを意図している場合

トレイトを使った方がいいケース

* 多重継承的に Mixin して他のクラスに対して機能を追加したい場合

https://gist.github.com/gakuzzzz/10081860

にあるように、迷ったら、とりあえず、
トレイトにしておき、その後、変更するってパターンもありっちゃーあり。

関連記事

Scala ~ 環境構築編 ~
https://dk521123.hatenablog.com/entry/2023/03/10/193805
Scala ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2023/03/12/184331
Scala ~ 基本編 / クラス ~
https://dk521123.hatenablog.com/entry/2023/03/14/000857