Scala Trait(特征)学习笔记

Scala中的Trait是一组字段和方法的集合,可以被多个类或对象共享。Trait既可以被用作接口,也可以被用作混入(mixin)。

定义Trait

在Scala中定义Trait十分简单,只需要使用关键字trait即可:

scalaCopy Code
trait ExampleTrait { def exampleMethod(): Unit = { println("This is an example method in trait") } }

使用Trait

Trait作为接口

Trait可以被看做是一种纯粹的抽象接口,可以被其他类继承实现其中的抽象方法。

scalaCopy Code
trait Speaker { def speak(): String // 抽象方法 } class Dog extends Speaker { def speak() = "汪汪" // 实现Speaker的speak方法 } class Cat extends Speaker { def speak() = "喵喵" // 实现Speaker的speak方法 }

Trait作为混入

Trait还可以被用作混入,以实现对多个类的代码复用,使用with关键字可以将Trait混入到其他类中。

scalaCopy Code
trait SwimmingAbility { def swimming(): Unit = { println("I can swim") } } class Animal // 此处Animal作为一个空类,只是为了举例 class Dolphin extends Animal with SwimmingAbility // Dolphin继承Animal类并混入SwimmingAbility Trait val dolphin = new Dolphin dolphin.swimming() // 输出 "I can swim"

实例

下面我们来写一个简单的实例,通过Trait实现日志记录功能:

scalaCopy Code
trait Logger { def log(message: String): Unit } class ConsoleLogger extends Logger { override def log(message: String): Unit = { println(s"[${java.time.LocalDate.now}] $message") } } class UserService(logger: Logger) { def register(username: String, password: String): Unit = { logger.log(s"User '$username' registered") // 具体的业务逻辑 } } val consoleLogger = new ConsoleLogger val userService = new UserService(consoleLogger) userService.register("binjie09", "123456")

输出结果为:

Copy Code
[2023-06-05] User 'binjie09' registered

以上就是Scala中Trait的学习笔记和实例代码。