■ はじめに
https://dk521123.hatenablog.com/entry/2023/03/10/193805
https://dk521123.hatenablog.com/entry/2023/03/12/184331
の続き。 今回は、クラス周辺について扱う。
試す環境
https://scastie.scala-lang.org/CEpZy3v4Taa0MCStp3LCYg
目次
【1】クラス 【2】抽象クラス 【3】ケースクラス 【4】継承 【5】トレイト - Trait 【6】シングルトンオブジェクト - object 【7】implicit
【0】Javaとの違い
色々変わっとる、、、 * Interface がなくなった(代わりに「【4】トレイト - Trait」)
【1】クラス
https://scala-text.github.io/scala_text/class.html
1)構文
class <クラス名> '(' (<引数名1> : <引数型1>, <引数名2>: <引数型2> ...)? ')' { (<フィールド定義> | <メソッド定義> )* }
2)コンストラクタ
// コンストラクタで値を設定する場合は、クラス名の後ろの()内にフィールドを定義 class ClassExample(val x: Int, var y: Int, z: Int = 0) {
https://qiita.com/takudo/items/8731612acbe7eae83183
3)アクセス権限
* Javaと比べてパッケージやクラスレベルでの詳細なアクセス権限が設定できる
名前 | キーワード | 説明 |
---|---|---|
公開(public) | なし | どこからでも参照可能 |
非公開 | private | それを定義しているクラス、オブジェクト内からのみ参照可能 |
限定公開 protected | それを定義しているサブクラスからのみ参照可能 | |
スコープ指定非公開 | private[scope] | scopeはアクセス可能 |
スコープ指定限定公開 | protected[scope] | 対象のサブクラスとscopeはアクセス可能 |
4)メソッド
* 以下の関連記事を参照のこと。
Scala ~ 基本編 / メソッド ~
https://dk521123.hatenablog.com/entry/2023/03/03/000000
5)サンプル
// クラス定義 class DemoClass(val id: Int, var name: String,val age: Int = 30) { val HELLO = "Hello" var greeting: String = "Hi" // メソッド定義(def) def sayHello(): String = { s"Hello, ${this.name}" } } // 呼び出し側 val obj = new DemoClass(1, "Mike") // id=1, name=Mike, age=30 println(s"id=${obj.id}, name=${obj.name}, age=${obj.age}") println(obj.sayHello())
【2】抽象クラス
// クラスの前にabstract 修飾子をつける abstract class DemoAbstract Class {
【3】ケースクラス
1)普通のクラスとの違い
[1] new を使わなくても生成可能 [2] 指定しなくても基本コンストラクタのフィールドにvalが付与 [3] 自動的に equals/canEqual/hashCode/toString/copy() を実装 [4] コンパニオンオブジェクトを自動生成し、apply/unapply()を自動実装
https://qiita.com/chimeiwang/items/b776c032bc4d4b687c32
【4】継承
1)構文
class <クラス名> <クラス引数> (extends <スーパークラス>)? (with <トレイト名>)* { (<フィールド定義> | <メソッド定義>)* }
2)継承させない - final
final class ClassName
【5】トレイト - Trait
* traitキーワードで定義 cf. trait = 特性
https://scala-text.github.io/scala_text/trait.html
1)構文
trait <トレイト名> {
(<フィールド定義> | <メソッド定義>)*
}
2)サンプル
trait Person { val name: String def sayHello(): Unit = print() }
3)用語整理:ミックスイン(Mix-in)とは?
* クラスがトレイトを継承すること
4)注意
* クラスパラメータ(コンストラクタの引数)を取ることができない * 通常クラスのようにコンストラクタを持つことはできない
【6】シングルトンオブジェクト - object
https://scala-text.github.io/scala_text/object.html
1)構文
object <オブジェクト名> extends <クラス名> (with <トレイト名>)* { (<フィールド定義> | <メソッド定義>)* }
【7】implicit
* 以下の関連記事を参照のこと。
Scala ~ 基本編 / メソッド ~
https://dk521123.hatenablog.com/entry/2023/03/03/000000
関連記事
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/03/000000
Scala ~ 基本編 / コレクション ~
https://dk521123.hatenablog.com/entry/2023/03/13/000345
Scala ~ YAML ~
https://dk521123.hatenablog.com/entry/2023/03/16/012034