Scalaのクラスはextends
キーワードで継承する
class Animal {
def speak(): String = "..."
}
class Dog extends Animal {
override def speak(): String = "Woof!"
}
override
修飾子は必須(Javaは任意)参照:サンプルコード
親クラスにコンストラクタがある場合、子クラスで明示的に呼び出す
class Animal(val name: String) {
def speak(): String = "..."
}
class Dog(name: String) extends Animal(name) {
override def speak(): String = s"$name says Woof!"
}
abstruct class
:抽象メソッドを持てるクラスinterface
に近いが、実装付きのメソッドも書けるabstruct class
と異なり、状態を持たずに振る舞いのみに集中するのが一般的trait Greeter {
def greet(name: String): String = s"Hello, $name!"
}
class EnglishGreeter extends Greeter
val greeter = new EnglishGreeter()
println(greeter.greet("ユーザー")) // Hello, ユーザー!
trait Friendly {
def beFriendly(): String = "I'm friendly!"
}
trait Polite {
def bePolite(): String = "Nice to meet you."
}
class Person extends Friendly with Polite
val p = new Person()
println(p.beFriendly()) // I'm friendly!
println(p.bePolite()) // Nice to meet you.
trait Speaker {
def speak(): String // 実装なし
}
参照:サンプルコード
型クラスの定義
trait Show[T] {
def show(x: T): String
}
given:型クラスのインスタンス、暗黙的に渡される値
given Show[Int] with {
def show(x: Int): String = x.toString
}
given Show[String] with {
def show(x: String): String = x
}
using:パラメータで暗黙的に受け取る
def printShow[T](x: T)(using s: Show[T]): Unit = {
println(s.show(x))
}
呼び出し
printShow(123) // Int 用 given が自動で使われる
printShow("Scala") // String 用 given が自動で使われる
明示的に渡すことも可能(printShow(123)(using Show[Int])
)
参照:サンプルコード