前章:統一型


  • クラスにはメソッドや値、変数、型、オブジェクト、トレイト、クラスを含めることができ、これらをまとめてメンバーと呼ぶ

クラスの定義

  • 最低限のクラス定義は、classキーワードと大文字から始まる識別子のみで構成される
// Scala3記法
class User
val user1 = User()
  • 上記のようにクラスにはコンストラクタに引数を取らないように定義できるが、多くの場合、下記のようにコンストラクタに引数を取ることがほとんどである
    • Pointクラスは変数xymoveメソッド、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名に_=をつける特殊な命名規則がある
  • コンストラクタ引数に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はクラス内部でしか使用できないので、コンパイルエラー

次章:パラメータのデフォルト値