文档介绍:trait基础知识
将trait作为接口使用
在trait中定义具体方法
在trait中定义具体字段
在trait中定义抽象字段
trait高级知识
为实例对象混入trait
trait调用链
在trait中覆盖抽象方法
混合使用trait的具体方法和抽象方法
trait字段的初始化
让trait继承类
将trait作为接口使用
scala中的trait是一种特殊的概念
首先我们可以将trait作为接口来使用,此时的trait就与java中的接口非常类似
在trait中可以定义抽象方法,就与抽象类中的抽象方法一样,只要不给出方法的具体实现即可
类可以使用extends关键字继承trait,注意这里不是implement,而是extends在scala中没有implement的概念,无论继承类还是trait,统一都是extends
类继承trait后必须实现其中的抽象方法,实现时不需要使用override关键字
scala不支持对类进行多继承,但是支持多重继承trait,使用with关键字
trait HelloTrait{
def method(name:String)
}
trait Hello2Trait{
def Hello2Trait(p:Person)
}
class Person(val name:String)extends HelloTrait with Hello2Trait with Cloneable with Serializable
{
def method(name:String)=println("Hello"+name)
def Hello2Trait(p:Person)=println("Hi"+name+)
}
object Test_01 {
def main(args: Array[String]): Unit = {
val tr=new Person("张三")
("A")
(tr)
}
}
在trait中定义具体的方法
scala中的trait可以不是只定义抽象的方法,还可以定义具体方法,此时trait更像是包含了通用工具的东西
有一个专有的名词来形容这种情况,就是说trait的功能混入了类
trait中可以包含一些很多类都通用的功能方法,比如打印日志等等,spark中就使用了trait来定义通用的日志打印方法
trait Logger{
def log(message:String)=println(message)
}
class Test_02(val name:String)extends Logger{
def test(){
log(name+"日志")
}
}
在trait中定义具体字段
scala中的trait可以定义具体的field,此时继承trait的类就自动获得了trait中定义的field
但是这种获得field的方式与继承class是不同的,如果是继承class类取的field,
trait