位置:首页 > Scala > Rust trait多继承详解与实现方法

Rust trait多继承详解与实现方法

时间:2026-08-15  |  作者:星河游者  |  阅读:0

一. 多个trait的加载顺序

实现多继承时,需要注意父子类构造器的执行顺序。

  • 先父后子
  • 有多个父类时,按书写顺序从左到右执行

例如:

trait A {
  println("a")
}

trait B {
  println("b")
}

class Class1 extends A with B {
  println("class1")
}

def main(args: Array[String]): Unit = {
  new Class1()
}

结果如图:

二. 多层trait的加载顺序

执行顺序很明确:先执行父类构造器,再进入子类构造器。

如果trait1本身还有自己的父类,也要先把它父类的构造器执行完。

trait A {
  println("A")
}

trait BB {
  println("BB")
}

trait B extends BB {
  println("B")
}

trait CC {
  println("CC")
}

trait C extends CC {
  println("C")
}

class Class1 extends C with A with B {
  println("Class1")
}

def main(args: Array[String]): Unit = {
  new Class1()
}

结果如图:

三. 空指针异常

错误代码演示

import ja va.io.FileWriter

object Class24 {

  // 在文件中写入日志
  trait FileLogger {
    // 抽象字段
    val filename: String
    val fileWriter = new FileWriter(filename, true)
    def writeLog(msg: String): Unit = {
      fileWriter.write(msg)
      fileWriter.close()
    }
  }

  class MyFileLogger extends FileLogger {
    val filename = "11-26.log"
  }

  def main(args: Array[String]): Unit = {
    val fileLogger = new MyFileLogger()
    fileLogger.writeLog("今天上午上scala课程")
  }

}

修改代码

lazy val fileWriter = new FileWriter(filename, true)

结果如图:

四. trait与抽象类的区别

相同点

类和trait有不少共通之处。

  • 都能定义成员变量
  • 无论是抽象的还是具体的都可以
  • 在继承时,二者都使用extends关键字

不同点

  • trait的构造器不能带参数
  • trait支持多继承

免责声明:文中图文均来自网络,如有侵权请联系删除,心愿游戏发布此文仅为传递信息,不代表心愿游戏认同其观点或证实其描述。

相关文章

更多

精选合集

更多

大家都在玩

热门话题

大家都在看

更多