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${変数}
のメソッドを追加してくれる。
まとめ
クラスやオブジェクト、今回はトレイトなど、オブジェクト指向の仕組みがたくさんあって、一度にはなかなか覚えられそうにない感じがします。
Author And Source
この問題について(Scalaの勉強はじめました 4 〜オブジェクトとクラス②〜), 我々は、より多くの情報をここで見つけました https://qiita.com/mybrother_jake/items/e2c837dc7498b3c06c3e著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .