在Scala中,特質(trait)是一種可以被類繼承或混入的抽象機制。特質類似于Java中的接口,但比接口更強大,可以包含字段、方法實現以及抽象方法。
要實現一個特質,在類定義時使用extends關鍵字,然后使用with關鍵字加上特質的名稱即可。例如:
trait Greet {
def greet(): Unit = {
println("Hello!")
}
}
class Person(name: String) extends Greet {
def sayHello(): Unit = {
greet()
println(s"My name is $name")
}
}
val person = new Person("Alice")
person.sayHello()
在上面的例子中,Greet是一個特質,Person類通過extends關鍵字繼承了Greet特質,并實現了sayHello方法,在sayHello方法中調用了特質中的greet方法。
特質還可以作為混入(mixin)來擴展類的功能。例如:
trait Logger {
def log(message: String): Unit = {
println(s"Log: $message")
}
}
class Person(name: String) {
def sayHello(): Unit = {
println(s"Hello! My name is $name")
}
}
class LoggedPerson(name: String) extends Person(name) with Logger {
def sayHelloAndLog(): Unit = {
log("Saying hello")
sayHello()
}
}
val loggedPerson = new LoggedPerson("Bob")
loggedPerson.sayHelloAndLog()
在上面的例子中,Logger是一個特質,LoggedPerson類通過with關鍵字混入了Logger特質,從而擁有了Logger特質中定義的log方法。LoggedPerson類繼承了Person類,并在sayHelloAndLog方法中調用了Logger特質中的log方法。