2010/01/28

Scala 入門2 - クラスとコンストラクタ

Scala でクラスを定義する。

class Test {
}
これだけ。

Scala はクラス定義と同時にコンストラクタを定義できる。

class Test(x:Int, y:Int, z:Int) {
  // 既存メソッドをオーバーライドするには override が必要
  override def toString = "x: " + x + ", y: " + y + ", z: " + z
}
val t = new Test(1, 2, 3)
println(t) // x: 1, y: 2, z: 3
ただし、これでは t.x のように外部からアクセスできない。
アクセスするために、引数をフィールドに保持する。(デフォルトでpublic)
class Test(x:Int, y:Int, z:Int) {
  val a = x
  val b = y
  val c = z
  override def toString = "a: " + a + ", b: " + b + ", c: " + c
}
val t = new Test(1, 2, 3)
println(t.a) // 1

コンストラクタのオーバーライドもできるよ。

class Test(x:Int, y:Int, z:Int) {
  val a = x
  val b = y
  val c = z
  def this(x:Int, y:Int) = this(x, y, 0)
  override def toString = "a: " + a + ", b: " + b + ", c: " + c
}
val t = new Test(1, 2)
println(t) // a: 1, b: 2, c: 0

でもこれはダメ。

class Test(x:Int, y:Int, z:Int) {
  var a = x
  var b = y
  var c = z
  def this(x:Int, y:Int) = {
    this.a = x
    this.b = y
    this.c = 0
  }
  override def toString = "a: " + a + ", b: " + b + ", c: " + c
}
val t = new Test(1, 2)
println(t)
// こんなコンパイルエラーが出る
//(fragment of test.scala):6: error: '(' expected but '.' found.
//    this.a = x
//         ^
コンストラクタをオーバーライドする場合、必ずクラス定義と同時に宣言したコンストラクタを最初に呼ばないといけない。
class Test(x:Int, y:Int, z:Int) {
  var a = x
  var b = y
  var c = z
  // こういうのはいい
  def this(x:Int, y:Int) = {
    this(x, y, 0)
    this.c = 1
  }
  override def toString = "a: " + a + ", b: " + b + ", c: " + c
}
val t = new Test(1, 2)
println(t) // a: 1, b: 2, c: 1
これも大丈夫(間接的に呼び出しているため)
class Test(x:Int, y:Int, z:Int) {
  val a = x
  val b = y
  val c = z
  def this(x:Int, y:Int) = this(x, y, 0)
  def this(x:Int) = this(x, 0)
  override def toString = "a: " + a + ", b: " + b + ", c: " + c
}
val t = new Test(1)
println(t) // a: 1, b: 0, c: 0

1 件のコメント :

  1. > コンストラクタのオーバーライドもできるよ。
    それオーバーロード(overload)

    返信削除