大三寒假学习 spark学习 Scala面向对编程 特质
特质概述:
- Java中提供了接口,允许一个类实现任意数量的接口。
- Scala中没有接口的概念,而是提供了“特质(trait)”,它不仅实现了接口的功能,还具备了很多其他的特性
- Scala的特质是代码重用的基本单元,可以同时拥有抽象方法和具体方法
- Scala中,一个类只能继承自一个超类,却可以实现多个特质,从而重用特质中的方法和字段,实现了多重继承
特质的定义:
使用关键字trait。
- 特质既可以包含抽象成员,也可以包含非抽象成员。包含抽象成员时,也不需要abstract关键字。
- 特质可以使用extends继承其它的特质,并且还可以继承类。
- 特质的定义体就相当于主构造器,与类不同的是,不能给特质的主构造器提供参数列表,而且也不能为特质定义辅助构造器。
代码示例:
trait CarId{ var id: Int def currentId(): Int //定义了一个抽象方法 } class BYDCarId extends CarId{//使用extends关键字 override var id = 10000 //BYD汽车编号从10000开始 def currentId(): Int = {id +=1; id}//返回汽车编号 } class BMWCarId extends CarId{//使用extends关键字 override var id = 20000 //BMW汽车编号从20000开始 def currentId(): Int = {id +=1; id}//返回汽车编号 } object MyCar { def main(args: Array[String]){ val myCarId1 = new BYDCarId() val myCarId2 =new BMwCarId() printf("My first CarId is %d. \n" ,myCarId1.currentId) printf("My second CarId is %d.\n",myCarId2.currentId) } }
将多个特质混入到类中:
trait carid{ var id: Int def currentId(): Int//定义了一个抽象方法 } trait carGreeting{ def greeting(msg: String) { println(msg) } } class BYDCarId extends CarId with carGreeting{ //使用extends关键字混入第1个特质,后面可以反复使用with关键字混入更多特质 override var id = 10000 //BYD汽车编号从10000开始 def currentId():Int = {id +=1; id}//返回汽车编号 } class BMWCarId extends CarId with carGreeting{ //使用extends关键字混入第1个特质,后面可以反复使用with关键字混入更多待质 override var id = 20000 //BNW汽车编号从20000开始 def currentId(): Int = {id +=1 ; id}//返回汽车编号 } object MyCar { def main( args:Array[String]){ val mycarid1 = new BYDCarId() val mycarid2 = new BMWCarid() mycarid1.greeting( "welcome my first car.") printf("Hy first carId is %d.\n" ,mycarId1.currentId) mycarId2.greeting("we1come my second car.") printf("My second CarId is %d.ln" ,mycarId2.currentId) } }