特质trait
在scala中是没有接口的概念的,但是有着和接口类似的概念,那就是特质trait。
scala类和java一样,不允许多重继承。但是和java接口一样,可以实现任意多个特质。
和java接口不一样的地方是,scala特质可以提供方法和字段的实现,相当于特质可以同时有用抽象方法和具体方法。
一个简单的特质例子如下:
trait Drinker {
def eat(food : String) // 特质方法没有实体某人为抽象
}
class Animal extends Drinker { // extends关键字
def eat(food : String): Unit = { // 不需要override
println("animal eat food:" + food)
}
}
如果一个类要继承多个特质,其他特质可以通过with关键字添加,比如:
trait Drinker {
def eat(food : String)
}
class Animal extends Drinker with Cloneable with Serializable { // with关键字
def eat(food : String): Unit = {
println("animal eat food:" + food)
}
}
特质的具体实现
- scala特质和java接口不一样的地方是scala的特质可以实现内部的方法,而且继承该特质的类可以使用该方法的实现。
- 如果继承的类要重写该特质的方法,需要override关键字。
- 经常特质中可以有很多具体的实现,这些实现可以依赖特质的抽象方法
比如:
trait Logger {
def log(msg : String)
def info(msg : String): Unit = {
log("INFO:" + msg)
}
def warn(msg : String): Unit = {
log("WARN:" + msg)
}
def error(msg : String): Unit = {
log("ERROR:" + msg)
}
}
特质中的字段
- 特质中也可以定义字段,该字段可以是抽象的,也可以是具体的(即给出了初始值)。
- 特质中的字段被继承时,会加到子类当中,属于子类的一部分。
- 特质中为初始化的字段在子类当中必须被重写。
weiwan