Scala Trait(特征)学习笔记
Scala中的Trait是一组字段和方法的集合,可以被多个类或对象共享。Trait既可以被用作接口,也可以被用作混入(mixin)。
定义Trait
在Scala中定义Trait十分简单,只需要使用关键字trait
即可:
scalaCopy Codetrait ExampleTrait {
def exampleMethod(): Unit = {
println("This is an example method in trait")
}
}
使用Trait
Trait作为接口
Trait可以被看做是一种纯粹的抽象接口,可以被其他类继承实现其中的抽象方法。
scalaCopy Codetrait 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 Codetrait 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 Codetrait 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的学习笔记和实例代码。