scala--特质

一、特质(trait)

  • Scala中没有接口(interface)的概念

  • 特质用于在类之间共享程序接口和字段,类似Java接口

  • 特质是字段和方法的集合,可以提供字段和方法实现

  • 类和单例对象都可以扩展特质(extends)

  • 特质不能被实例化,因此没有构造参数,类似Java接口

  • 特质使用“trait”关键字定义

  • 实现特质中的方法使用“override”

二、混入特质(mixin)

  • 当某个特质被用于组合类时,被称为混入

  • 一个类只能有一个父类但是可以有多个混入(分别使用关键字extends和with)

trait Type1{
  def wheele:String= "四轮驱动"
  def run():Unit
}

trait Type2{
  def fly()= println("可以飞")
  def down()= println("下海")
}

//定义抽象类
abstract class Car {
  def brand:String
  def engine:String
  def didi():String ={
    "汽车鸣笛"
  }
}

//实现类 混入特质
class BMW extends Car with Type1 {
  override def brand: String = {
    "德系宝马"
  }

  override def engine: String = {
    "6.0自然吸气,燃油动力"
  }

  override def run(): Unit = {
    println("在路上跑")
  }
}

class LingYun extends Car {
  override def brand: String = "凌云汽车"
  override def engine: String = "纯电动汽车"
}

object test{
 def main(args: Array[String]): Unit = {
  val bmw=new BMW
  println(bmw.brand)
  println(bmw.engine)
  println(bmw.didi())
  println(bmw.wheele)
  bmw.run()

//动态混入特质
  val lingYun:LingYun=new LingYun with Type1 with Type2{
    override def run(): Unit = {
      println("两轮电动汽车")
    }
  }
  println(lingYun.brand)
  println(lingYun.engine)
  lingYun.run()
  lingYun.fly()
  lingYun.down()
 }
}

三、特质与抽象类的选择

  • 优先使用特质
    1.抽象类只能继承一次
    2.特质可混入多个

  • 需要使用带参构造方法时,使用抽象类

  • 与Java互操作性
    1.抽象类与Java完全可互操作
    2.特质只有在不包含任何实现代码时才可互操作

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值