risc-v中文社区

 找回密码
 立即注册
查看: 1019|回复: 0

[原创] risc-v开发基础 Scala 特质trait---(15)

[复制链接]

347

主题

564

帖子

2237

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2237
发表于 2021-8-5 09:58:30 | 显示全部楼层 |阅读模式
特质(trait)
在java中,如果一个类想实现某个接口,则需要用implements,比如 class MyClass implements Comparable<XXX>{@Override public int compareTo(Float o)...}
在scala特质trait中,可以允许有具体实现方法,trait可以extends某个父类,实例化某个类的时候可以临时混入某一个或多个需要的特质trait,混入特质之后的初始
化顺序是怎么样的呢?这些都需要我们搞清楚。
package scala.joe.com

//校验trait
trait Valid {
  //"构造方法体"
  println("trait Valid constructor running....")
  //抽象方法
  def getName:String
  //校验方法 具体方法
  def valid(v:String):Boolean = getName.equals("joeliang")
}
//日志log trait
trait Log {
  println("trait Log constructor running...")
}
//签名log
trait SignalLog extends Log { //trait混入另一个trait时也要用继承extends,不能用with
  println("trait SignalLog constructor running....")
}
trait NameLog extends Log {
  println("trait NameLog constructor running....")
}
//Personx类
class Personx extends Valid with SignalLog with NameLog {
  println("Personx constructor running.....")
  override def getName: String = this.toString
}
object TestTrait {
  def main(args: Array[String]): Unit = {
    val p = new Personx
  }
}
显示如下:
trait Valid constructor running....
trait Log constructor running...
trait SignalLog constructor running....
trait NameLog constructor running....
Personx constructor running.....
实验结果说明:Personx在实例化构造时,先构造extends Valid(不管Valid是类还是trait,统一都要用extends),然后再是后面的所有trait
在这些traits中,总顺序是从左到右,每个trait在构造的时候先构造其父trait(如果是trait extends的是某个类,则此时是先构造父类)
如果在构造某个trait的时候,发现其父trait或父类已经被构造了,则不会再构造,所有trait都构造完毕之后才构造这个类



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



Archiver|手机版|小黑屋|risc-v中文社区

GMT+8, 2024-5-3 15:09 , Processed in 0.014401 second(s), 17 queries .

risc-v中文社区论坛 官方网站

Copyright © 2018-2021, risc-v open source

快速回复 返回顶部 返回列表