Traits are a fundamental unit of code reuse in Scala. A trait encapsulates method and field definitions, which can then be reused by mixing them into classes. Unlike class inheritance, in which each class must inherit from just one superclass, a class can mix in any number of traits. Once a trait is defined, it can be mixed in to a class using either the extends or with keywords.
trait类似Java中可以带有实现的接口,Java中有多接口继承,scala中有多trait集成
trait相对于普通的类,不管是具体类,还是抽象类,一个重要的差别是trait的主构造函数不能带有参数,
例如
trait ThisIsTrait(arg: String)
定义了多个trait的Animal类:
package spark.examples.scala.twaits
trait Animal {
def weight = 0
//抽象方法
def speak
}
trait HasLegs {
def numLegs = 0
}
trait CanClimbTree {
def canClimeTree = false
}
trait GenericsTrait[T] {
def get: T
}
trait Getter1 {
def duplicateGet = 101
def duplicateGet2 = 1012
}
trait Getter2 {
def duplicateGet = 102
def duplicateGet2 = 2012
}
trait Getter3 {
def getIt = 100
}
//trait跟class的一个重要区别是,trait主构造函数不能有参数,如下错误
/*
trait
*/
mixin trait的具体类:Cat
package spark.examples.scala.twaits
//The first one uses Animal; the others use with,one with for each
class Cat(name: String) extends Animal with HasLegs with CanClimbTree with GenericsTrait[Int] with Getter1 with Getter2 with Getter3 {
override def weight: Int = 3
override def numLegs: Int = 4
override def canClimeTree: Boolean = true
//抽象方法
override def speak: Unit = {
println("Miao")
}
override def toString: String = {
"I am a cat: " + name
}
override def duplicateGet = 300
override def get = {
super.duplicateGet + 100 //为什么super指向的是Getter2而不是Getter1
}
override def duplicateGet2 = {
super.duplicateGet2 + 10001 //为什么super指向的是Getter2而不是Getter1
}
override def getIt: Int = {
super.getIt + 120
}
}
调用程序
package spark.examples.scala.twaits
object TwaitTest {
def main(args: Array[String]) {
val c = new Cat("kitty")
c.speak
println(c.numLegs)
println(c.canClimeTree)
println(c.get)
//两个trait定义了相同的方法并且提供了实现,那么Scala会报方法冲突,解决办法,实体类进行重写
println(c.duplicateGet)
//通过super调用父实现
println(c.getIt)
println(c.duplicateGet2)
}
}
问题:在使用super.methodName时,如果多个trait都有那个方法时,为什么一直都是最后一个起作用,如果要让第一个起作用,该如何操作?