作为一门支持面向对象的语言,scala对于继承当然也有很好的支持,下边我们看下这部分内容:
1.抽象类
scala的抽象类范例:
abstract class Car{
val carBrand: String //字段没有初始化值,就是一个抽象字段
def info() //抽象方法,不需要使用abstract关键字
def greeting() {println("Welcome to my car!")}
}
需要注意:
- 我们使用关键字abstract定义一个抽象类。
- 抽象类的抽象方法,不需要关键字abstract,只要把方法体空着,不写方法体就可以。
- 抽象类中定义的字段,只要没有给出初始化值,就表示是一个抽象字段,但是,抽象字段必须要声明类型,否则编译会报错。
2.扩展类
scala的扩展类和java有一点区别:
class BMWCar extends Car {
override val carBrand = "BMW"
def info() {printf("This is a %s car. It is on sale", carBrand)}
override def greeting() {println("Welcome to my BMW car!")}
}
可以看出,我们一样是使用extends关键字继承Car类,但在实现上,有一些注意点:
- 重写抽象类的字段时,需要使用override关键字,否则编译会报错。
- 重写抽象类的抽象方法时,不需要override关键字,但加上也不会报错。
- 重写抽象类的非抽象方法时,必须使用override关键字,否则编译会报错。
3.特质trait
特质用来在类之间进行接口或者属性的共享,有点类似java的interface。
特质的定义:
trait CarId{
var id: Int
def currentId(): Int //抽象方法
def greeting(msg: String) {println(msg)} //非抽象方法
}
注意,我们使用trait来定义一个特质,特质中没有方法体的方法,默认为抽象方法。和java的interface不同的是,特质中可以包含具体的实现。
和java一样,scala也是“单继承,多实现”,即只能继承一个抽象类,但可以实现多个特质,我们通过extends [特质1] with [特质2] with [特质3] with…这样的方式实现多个特质,范例:
trait One {
def one:String
}
trait Two {
def two:String
}
trait Three {
def three:String
}
class test extends One with Two with Three {
override def one: String = ???
override def two: String = ???
override def three: String = ???
}