Scala_Trait特征

本文详细介绍了Scala中的特质(trait)概念,包括特质如何同时拥有抽象方法和具体方法,类如何继承多个特质,以及在Scala中如何正确使用extends和with关键字。文章还探讨了trait中字段的定义与使用,以及自身类型(selftype)的概念,为读者提供了全面的Scala特质应用指南。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1,scala提供的“特征”可以同时拥有抽象方法和具体方法,一个类可以拥有多个特质

2,类可以通过“extends”关键字继承trait,继承trait后必须实现trait中的所有抽象方法,而不是用 override 关键字

3,scala的类只能单继承,单可以继承多个trait,trait之间使用 with 关键字连接

package scalaTest

object TraitApp{
  // 创建trait
  trait trait1{
    // 没有具体实现的方法
    def sayTrait(name : String) 
    // 有具体实现的方法
    def sayHello = println("nice to meet you")
  }
  
  trait tarit2{
    def sysTrait2(age : Int)
  }
  
  trait trait3{
    def sysTrait3(num : Int)
  }
  
  class Person(private var name : String) extends trait1 with tarit2{
      def getName = name
      def sayTrait(name : String) = println("Hello " + name)
      def sysTrait2(age : Int) = println(name + " is " + age)
  }
  
  def main(args: Array[String]): Unit = {
    val p = new Person("trait") 
      p.sayTrait(p.getName)
      p.sysTrait2(33)
      p.sayHello
      
      // 可在创建对象时用with
      val p1 = new Person("TRAIT") with trait3{
      def sysTrait3(num : Int) = println(num)
    }
    p1.sysTrait3(33)
  }
}

4,trait中可定义抽象字段(没有初始化的字段)和具体的字段(已经初始化了的字段), 类继承了trait后,必须实现抽象字段,即初始抽象字段,类中可以直接使用trait中字段。而类继承了类,需使用 super 关键字使用父类中的字段。

5,继承多个trait的时候,总体构造原则是“从左到右,从父到子构造从右到左,从子到父调用”。

6,自身类型(selftype)

有很多特质不是所有类都能随随便便继承的,例如异常类所能继承的特质,其他类继承并不合适,所以需要对特质加以约束。

通过“this : T => {}”的形式,指定这个特质只能被T或T的子类继承

也可以通过“this : {}  => {}”的形式,指定这个特质能被继承的规则,“this : {}”中的“{}”就可以设置规则,比如必须拥有指定对象、方法的类才能继承这个特质。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值