学習メモ: クラス (1/2) #dwango #Scala
この記事について
ドワンゴScala研修テキストを学習したときのメモです。 okoysm.hatenablog.jp
DOING
クラス
クラス定義
- 記述方法以外はJavaと同じ (パラメータの指定方法くらい?)
class ClassName(parameter1: Type1, parameter2: Type2, ...) { (a field or method definition)の0回以上の繰り返し }
例)点を表すクラスを定義する場合
class Point(_x: Int, _y: Int) { val x = _x val y = _y }
コンストラクタの引数をそのまま公開したい場合は以下のように短く書ける
class Point(val x: Int, val y: Int)
疑問点
使うからクラスを定義するんだろうし、そのまま公開するケースのほうが多い気がしたのだけどどうなのだろう?
ポイント
この書き方のポイントは大きく2点。
- クラス名の直後にコンストラクタの定義がある
- Scalaでは1クラスに付き、基本的には1つのコンストラクタしか使わない
- 文法上は複数のコンストラクタを定義できるようになっていますが、実際に使うことはまずないので覚える必要はない
- 最初の1つのコンストラクタをプライマリコンストラクタとして特別に扱っている
- val/varによって、コンストラクタ引数をフィールドとして公開することができる
- プライマリコンストラクタの引数にval/varをつけるとそのフィールドは公開され、外部からアクセスできるようになる
- コンストラクタ引数のスコープはクラス定義全体におよびます。
これを使うと、メソッド定義の中から直接コンストラクタ引数を参照できる。
このプログラムの場合+
メソッド定義の中から直接コンストラクタ引数を参照している
class Point(val x: Int, val y: Int) { def +(p: Point): Point = { new Point(x + p.x, y + p.y) } override def toString(): String = "(" + x + ", " + y + ")" }
この章での疑問点
- コンストラクタの引数をそのまま公開したくない場合などあるのだろうか(Javaでいうprivateな変数にしてgetter/setterで取らせたいみたいなやつかな)
進捗
DONE
DOING
- クラス