scala 中特质(trait)

48 阅读2分钟

在 Scala 的面向对象世界里,‌特质(trait) ‌是代码复用与多继承的“魔法钥匙”——它既不像 Java 接口那样“只定义不实现”,也不像抽象类那样“继承规则死板”,而是以更灵活的方式,让“功能模块”像积木般拼接,让代码在复用与扩展中游刃有余。

一、特质是什么?

特质(trait)是 Scala 中用于实现代码复用和多继承的核心语法结构,类似 Java 8+ 的接口(但功能更强大)。可以把它理解为:一组可以被多个类共享的属性和方法集合,类通过「混入(with)」特质来获得这些能力。

二、特质的核心语法:抽象与具体成员

特质中的成员(属性 / 方法)分为「抽象」和「具体」两类,区分规则非常简单:

  • 具体成员:有初始值(属性带 = 赋值)或有方法体(方法带 {} 实现)
  • 抽象成员:无初始值(属性仅声明类型)或无方法体(方法仅声明签名),必须由混入的类实现

实例:定义两个独立特质

我们通过两个特质模拟「漂亮眼睛」和「高挑身材」两种能力,包含不同类型的成员:

package level02

/* 特质
* trait: 实现多继承(混入多个特质)
* 具体属性和抽象属性 怎么区分?
* 有具体值的(带 = 赋值),就是具体属性;无具体值(只声明类型),就是抽象属性
*/

object class15 {
  // 独立特质1:包含具体属性、抽象属性、抽象方法
  trait BeautifulEye {
    val beautifulGuy = "超级漂亮" // 具体属性(带 =)
    val name: String // 抽象属性(无 =,只声明类型)
    def jump(): Unit // 抽象方法(无方法体,必须由子类实现)
  }

  // 独立特质2:包含具体属性、具体方法
  trait Tall {
    val height: String = "太高" // 具体属性
    var weight: Int = 0 // 具体属性(var 可变)
    def run(): Unit = { // 具体方法(有方法体)
      println("run...")
    }
  }

  // 子类:混入两个独立特质,实现抽象属性和抽象方法
  class Child extends BeautifulEye with Tall {
    override val name: String = "小记"
    override def jump(): Unit = {
      println(s"$name, jump...")
    }
  }

  // 主方法(程序入口)
  def main(args: Array[String]): Unit = {
    val child = new Child()
    println(child.name)
    println(child.height)
    println(child.beautifulGuy)
    child.run()
    child.jump()
  }
}
  • 完结撒花 !!!!!!!!!!
  • 制作不易 希望·一键三连 在此感谢关注的粉丝宝宝
  • 新来的宝宝可以关注下主播哟!!!!!