##継承先で複数のtraitで定義したメソッド名が被った場合
下記でコンパイルするとどっちのgetInfo()を実行すべきかわからないといった意味のエラーが出力される。
//Example
trait printable {
def getInfo() :Unit = println("now printing...")
}
trait sharable {
def getInfo() :Unit = println("now sharing...")
}
class User extends printable with sharable
object MyApp {
def main(arg :Array[String]) :Unit = {
val user = new User
user.getInfo()
}
}
##対処法1
superを使って、適用したいメソッドが定義されているトレイト名を継承先のクラスで指定してあげる方法。
trait printable {
def getInfo() = println("now printing...")
}
trait sharable {
def getInfo() = println("now sharing...")
}
class User extends printable with sharable{
def getInfo() = super[printable].getInfo()
}
object MyApp {
def main(arg: Array[String]) :Unit = {
val user = new User
user.getInfo() // "now printing..."
}
}
##対処法2
新たにtraitで、メソッドを抽象化して定義し、各々のtraitその抽象メソッドをoverride -> 継承の流れ。
trait Common {
def getInfo()
}
trait printable extends Common {
override def getInfo() :Unit = println("now printing...")
}
trait sharable extends Common {
override def getInfo() :Unit = println("now sharing...")
}
class User extends printable with sharable
object Myapp{
def main(arg :Array[String]): Unit = {
val user = new User
user.getInfo() // "now sharing..."
}
}
extendsで継承されたprintableよりも後に、読み込まれるsharableでCommonトレイトをoverrideし、具象メソッド化したgetInfo()メソッドがここでは、呼び出されるようになる。