Scalaの勉強はじめました 4 〜オブジェクトとクラス②〜


はじめに

N予備校の「Scala基礎」「Scala応用」コースを受講しています。
「オブジェクトとクラス」でざっくりまとめたことを少し後悔してます。

トレイトとミックスイン

トレイト(振る舞い)を継承することをミックスインという

複数のトレイトを1つのクラスやトレイトにミックスインできる。
直接インスタンス化はできない。
クラスパラメータ(コンストラクタ引数)を取ることができない。

traitで定義されるメソッドは、必ずしも実装する必要がない

class PaperCup extends Paper with Fillable with Disposable

クラスを同じやり方で複数継承はできないので注意。

super

class Class2 extends TraitB with TraitC {
  override def greet(): Unit = super[TraitB].greet()
}

継承やミックスインで利用している型を指定して自身のインスタンスを呼び出す。
superキーワードは、自分の親クラスやミックスインしているトレイトを指す。

自分型アノテーション

クラスやトレイトの中で自分自身の型にアノテーション(情報の付加、補足)を記述できる

trait Greeter {
  def greet(): Unit
}

trait Robot {
  // 自分型アノテーション
  self: Greeter =>

  def start(): Unit = greet()
  override final def toString = "Robot"
}

オブザーバーパターン

特定のオブジェクトの状態を監視するオブジェクトを用意して、イベント発生時にその変更を受け取って処理できるように実装する

trait Listener {
  // 変化があった時に通知する => リスナー
  def changed(newValue: Int): Unit
}

object Observable {
  // 監視対象のオブジェクト
  private var num = 0
  private var listeners = Seq[Listener]()

  def increment(): Unit = {
    num = num + 1
    // 変化があったことを通知する
    listeners.foreach(l => l.changed(num))
  }

  def addListener(listener: Listener) = listeners = listeners :+ listener
}
// インスタンス
Observable.addListener(new Listener {
  override def changed(newValue: Int): Unit = println(s"${newValue} に変わったよ")
})

JavaBeans

状態を持ち、 setで値を変更でき、 get で 属性を取得できる データクラス

セッター・ゲッターっていうやつ。

import scala.beans.BeanProperty

class Movie {

  @BeanProperty
  var id: Long = _

  @BeanProperty
  var fileName: String = _

  @BeanProperty
  var time: String = _

  @BeanProperty
  var filePath: String = _

  @BeanProperty
  var media: Media = _  
}

@BeanProperty
型やメンバーなどに特別な意味をあたえることができる仕組み
varの変数に対してこのアノテーションを与えると、コンパイラが自動で get${変数}set${変数}のメソッドを追加してくれる。

まとめ

クラスやオブジェクト、今回はトレイトなど、オブジェクト指向の仕組みがたくさんあって、一度にはなかなか覚えられそうにない感じがします。