クラス定義
Scala はオブジェクト指向プログラミング言語でもあるので、当然クラスの定義もできる。もっとも簡単な例は次のようになる。
scala> class Point(_x: Int, _y: Int) {
| val x = _x
| val y = _y
| }
defined class Point
これは x と y というフィールドを持つクラスだ。フィールドの宣言には val と var が使える。もちろん val で宣言したフィールドは代入できない。
クラスをインスタンス化するには new キーワードを使う。Point というクラス名の後につづく ( ) 内の引数がそのままコンストラクタの引数になる。
scala> val p = new Point(3, 2)
p: Point = Point@1409fe14
コンストラクタの引数名とフィールド名が同じでよければ、次のように簡単に書ける。
scala> class Point(val x: Int, val y: Int)
defined class Point
フィールドのアクセス制御
フィールドはデフォルトでパブリックなので、外側から参照することができる。
scala> p.x
res0: Int = 3
scala> p.y
res1: Int = 2
パブリックにしたくなければ、フィールドの宣言に private または protected キーワードをつける。private をつけるとそのクラスの中だけから、protected をつけるとクラスの派生クラスだけからアクセスできるようになる。private をつけた例を見てみよう。
scala> class Person(_name: String, _age: Int) {
| val name = _name
| private var age = _age
| }
<console>:13: warning: private var age in class Person is never used
private var age = _age
^
おっと、警告が出た。プライベートは変数 age が使われない、みたいなことを言われてるようだ。ま、そりゃそうだ。今はフィールドを操作するメソッドがないから、外からアクセスできないフィールドだけあっても役に立たないからな。でも、とりあえずクラス定義はできて、インスタンス化もできる。
scala> val andy = new Person("Andy", 27)
andy: Person = Person@4bd808d0
scala> andy.name
res0: String = Andy
scala> andy.age
<console>:13: error: variable age in class Person cannot be accessed in Person
andy.age
^
パブリックな name にはアクセスできて、プライベートな age にはアクセスできない様子がわかる。