■ はじめに
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