Scala まとめ
2018-10-22 (Mon) · 247 words

object

用途

class SampleSuper(a: Int)
class Sample(b: Int) extends SampleSuper(b)

object SampleSuper {
  def apply(c: Int): SampleSuper = new Sample(c)
}
object Sample {
  def apply(c: Int): SampleSuper = new Sample(c)
}

コンパニオンオブジェクト

trait

抽象メンバーの上書き

trait TraitA {
  val name: String
  def printName: String = println(name)
}
class ClassA(val name: String) extends TraitA

トレイとをミックスインしたクラスのコンストラクタで、抽象メンバー name をオーバーライドしている。

object ObjectA {
  val a2 = new TraitA { val name = "tsuchiya" }  
}

name を上書きするような実装を与えてもよい

菱形継承問題

初期化順の要注意

trait A {
  val foo: String
}

// トレイトの初期化順序
trait B extends A {
  val bar: String = foo + "World"
}
class ClassB extends B {
  val foo = "Hello"
  def printBar: Unit = println(bar)
}
(new ClassB).printBar // nullWorld

// 初期化順の回避1 遅延評価
trait C extends A {
  lazy val bar: String = foo + "World"
}
class ClassC extends C {
  val foo = "Hello"
  def printBar: Unit = println(bar)
}
(new ClassC).printBar // HelloWorld

// 初期化順の回避2 関数化
trait D extends A {
  def bar: String = foo + "World"
}
class ClassD extends D {
  val foo = "Hello"
  def printBar: Unit = println(bar)
}
(new ClassD).printBar // HelloWorld

// 初期化順の回避3 事前定義(Early Definitions)
trait E extends A {
  val bar: String = foo + "World"
}
class ClassE extends {
  val foo = "Hello"
} with E {
  def printBar: Unit = println(bar)
}
(new ClassE).printBar // HelloWorld

型パラメータ(type parameter)

共変(covariant)


Top     back     Posts     Tags     About Me