scala教程:trait

说明

trait可以定义 抽象属性、抽象方法,也可以定义 普通属性、普通方法

相当于 java中的 抽象类

应用场景

Array 的 foreach() 方法,就在 trait 中定义的,如下:

作用

  • 主要是 声明方法,相当于 制定规范、标准
  • 弥补单继承的缺点

类比

android手机流行前的功能机时代,不同手机厂商的手机,充电口互不通用,导致十分混乱

trait 相当于 USB接口,通过制定 USB接口规范,其他厂家按照该规范生产制造USB接口,符合USB接口的设备,都可以 充电 或 传输数据,达到 通用 的目的

定义 trait

trait 名字{

}

例子

定义 USB

trait USB{
  /**
   * 定义普通属性
   */
  var version = "3.0"
  /**
   * 定义抽象属性
   */
  var name:String

  /**
   * 可以定义抽象方法
   */
  def chongdian():Unit

  /**
   * 可以定义普通方法
   */
  def chuanshu():Unit = {
    println("传输数据完成")
  }
}

定义 Zhiwen

//指纹识别接口
trait Zhiwen{
  //识别
  def shibie():Boolean
}

使用trait

没有父类

class 类名 extends 特质 1 with 特质 2  …{

}

说明:

  1. 类和特质的关系:继承 的关系。

  2. 当一个类去继承特质时,第一个连接词是 extends,后面是 with

有父类

class 类名 extends 父类 with 特质 1 with 特质 2 …{


}

说明: 如果一个类在同时 继承 特质 和 父类 时,应当把父类写在 extends 后,把特质 写在 with 后

例子

trait USB{
  /**
   * 定义普通属性
   */
  var version = "3.0"
  /**
   * 定义抽象属性
   */
  var name:String

  /**
   * 可以定义抽象方法
   */
  def chongdian():Unit

  /**
   * 可以定义普通方法
   */
  def chuanshu():Unit = {
    println("传输数据完成")
  }
}

trait Zhiwen{

  def shibie():Boolean
}

实现类:


class Android extends USB with Zhiwen {

  //非抽象类,必须要给抽象属性赋值
  var name: String = "USB快充"

  override def chongdian(): Unit = {
    println(s"使用 ${name} 充电完成")
  }

  override def shibie(): Boolean = true
}

测试:

def main(args: Array[String]): Unit = {
  val xiaomi=new Android

  println(s"USB名: ${xiaomi.name}")
  println(s"USB版本: ${xiaomi.version}")
  xiaomi.chongdian()
  xiaomi.chuanshu()
  val res = xiaomi.shibie()
  println(s"识别结果:$res")
}

原文出处:/show_1IX1DwiK3Awx.html