- 案例
package keyword
object WithKwDemo {
def main(args: Array[String]): Unit = {
val person = new Person("John", "Doe")
person.greet()
}
}
trait Logger {
def log(message: String): Unit = println(s"Log: $message")
}
trait User {
val name: String
}
class Person(val firstName: String, val lastName: String) extends User with Logger {
val name = s"$firstName $lastName"
def greet(): Unit = {
log(s"Hello, my name is $name.")
}
}
- 案例说明
定义了两个特质:Logger和User。Logger特质有一个名为log的方法,用于输出日志信息。User特质定义了一个抽象属性name,表示用户姓名。
创建了一个Person类,它继承自User特质并混入了Logger特质。Person类有两个构造函数参数firstName和lastName,它们用于初始化name属性。greet方法调用log方法输出问候信息。
输出结果:Log: Hello, my name is John Doe.
小结:可以看到,with关键字在Person类的定义中起到了混入Logger特质的作用,使得Person类具备了日志打印的功能。
- 扩展
目前对一些优秀的开源框架,比如:Apache StreamPark 大量使用了该关键字,示例如下