前章:統一型
- クラスにはメソッドや値、変数、型、オブジェクト、トレイト、クラスを含めることができ、これらをまとめてメンバーと呼ぶ
クラスの定義
- 最低限のクラス定義は、
classキーワードと大文字から始まる識別子のみで構成される
// Scala3記法
class User
val user1 = User()- 上記のようにクラスにはコンストラクタに引数を取らないように定義できるが、多くの場合、下記のようにコンストラクタに引数を取ることがほとんどである
Pointクラスは変数xとy、moveメソッド、toStringメソッドのメンバーが含まれるAnyRefに定義されているtoStringをオーバーライドしている
// Scala3記法
class Point(var x: Int, var y: Int):
def move(dx: Int, dy: Int): Unit =
x = x + dx
y = y + dy
override def toString: String =
s"($x, $y)"
end Point
val point1 = Point(2, 3)
println(point1.x) // prints 2
println(point1) // prints (2, 3)Constructors
- コンストラクタはデフォルト値を指定することで、オプションのパラメータを持つこともできる
- コンストラクタは引数を左から右に読み込むので、右の引数のみ値を渡したい場合は名前を指定して値を渡す必要がある
// Scala3記法
class Point(var x: Int = 0, var y: Int = 0):
override def toString: String =
s"($x, $y)"
end Point
val origin = Point() // xとyにはデフォルト値の0がセットされる
val point1 = Point(1) // xには1がセットされ、yにはデフォルト値の0がセットされる
val point2 = Point(y = 2) // xにはデフォルト値の0がセットされ、yには2がセットされる
println(point1) // (1, 0)
println(point2) // (0, 2)プライベートメンバとGetter/Setter構文
- メンバーはデフォルトでは公開される。クラス外部からのアクセスを防ぐには
private修飾子を使用する
class Point:
private var _x = 0
private var _y = 0
private val bound = 100
def x: Int = _x
def x_=(newValue: Int): Unit =
if newValue < bound then
_x = newValue
else
printWarning()
def y: Int = _y
def y_=(newValue: Int): Unit =
if newValue < bound then
_y = newValue
else
printWarning()
private def printWarning(): Unit =
println("WARNING: Out of bounds")
end Point
val point1 = Point()
point1.x = 99
point1.y = 101 // y_のSetterが呼び出されるので、WARNING: Out of boundsが出力される- GetterとSetterが揃い、変数メンバへの代入を行う場合は内部的にSetterが呼び出される
- SetterはGetter名に
_=をつける特殊な命名規則がある
- SetterはGetter名に
- コンストラクタ引数に
val/varをつけるとpublicなメンバになる
class Point(val x: Int, val y: Int)
val point = Point(1, 2)
point.x = 3 // valは不変なので再代入はできず、コンパイルエラー- コンストラクタ引数に
val/varをつけないとprivateなメンバになる
class Point(x: Int, y: Int)
val point = Point(1, 2)
point.x // xはクラス内部でしか使用できないので、コンパイルエラー次章:パラメータのデフォルト値