クラス

2019年5月7日
1 分

クラス定義

Scala はオブジェクト指向プログラミング言語でもあるので、当然クラスの定義もできる。もっとも簡単な例は次のようになる。

scala> class Point(_x: Int, _y: Int) {  
     |     val x = _x  
     |     val y = _y  
     | }  
defined class Point

これは xy というフィールドを持つクラスだ。フィールドの宣言には valvar が使える。もちろん 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 にはアクセスできない様子がわかる。