前面我们学习了类的继承,下面我们看一种专为继承而生的类:抽象类。
在Scala面向对象编程中,抽象类是实现代码复用和多态性的重要工具。本文将通过多个实际案例,深入解析Scala抽象类的使用方法、特性以及实际应用场景。
理解抽象类
类本身就是对对象的抽象,抽象类就是对类的抽象,就是一种更加模糊的类。
定义
抽象类是一个包含一个或多个抽象方法的类。抽象方法是不带任何实现的方法。抽象类也可以包含具体的方法和属性。
目的
抽象类的主要目的是为子类提供公共的接口和部分实现,并确保子类实现抽象方法。
定义抽象类
定义一个Scala的抽象类
abstract class A{ }。
基础抽象类实现
基础抽象类与抽象方法
package level02
/*
* 抽象类
* 1. 一个抽象类,不能被new
* 一个类不能直接用来创建对象,那么这个类具体有什么用呢? 做别人的父亲!
* 2. 可以定义抽象方法,在子类中去实现
* */
object base2702 {
abstract class AICar {
// 抽象方法:没有具体的函数代码。
def autoEn():Unit
// 具体方法
def autoDrive () :Unit = {
println("具体方法,自动驾驶......")
}
}
// 在子类中,一定要去实现父类的所有抽象方法
class SU7 extends AICar{
// 使用 去实现这个方法
override def autoEn(): Unit = {
println(s"采用小米独家的无线充电技术,停车就可以充电")
}
}
def main(args: Array[String]): Unit = {
// val car1 = new AICar()
val su = new SU7
su.autoEn()
}
}
运行结果
代码分析
abstract class表示这是一个抽象类,不能直接实例化(即不能用new AICar()创建对象)。def autoEn():Unit是抽象方法因此没有具体的函数代码。def autoDrive(): Unit = {...}是具体方法,有明确的逻辑(打印 “具体方法,自动驾驶……”),子类可直接继承使用。class SU7 extends AICar表示SU7是AICar的子类,通过extends实现继承。override def autoEn(): Unit = {...}中,override关键字明确表示这是对父类抽象方法的重写,必须实现父类所有抽象方法(否则编译报错)。
抽象属性与构造器参数
抽象属性与构造器参数的使用
package level02
object base2703 {
/* // 方法一:
abstract class AICar {
val name: String // 抽象属性
def autoRun(): Unit // 抽象方法
}
// 在子类中,一定要去实现父类的所有抽象方法
class XiaoMi extends AICar {
val name: String = "xiaomi"
def autoRun(): Unit = {
println("小米汽车,自动驾驶......")
}
}
def main(args: Array[String]): Unit = {
var car1 = new XiaoMi
car1.autoRun()
}
*/
// 方法二:使用构造器参数
abstract class AICar(val name: String) {
def autoRun(): Unit
}
// 在子类中,一定要去实现父类的所有抽象方法
class XiaoMi(name: String, val brandName: String) extends AICar(name) {
def autoRun(): Unit = {
println(s"${brandName}汽车,自动驾驶......")
}
}
def main(args: Array[String]): Unit = {
val car1 = new XiaoMi("SU7", "小米")
car1.autoRun()
}
}
运行结果
代码解析
- 方法一:在抽象类中定义抽象属性,子类中实现
- 方法二:通过构造器参数传递属性值,更加灵活
- 两种方法都能实现相同的功能,根据具体需求选择
完整抽象类特性展示
抽象类的完整成员构成
package level02
object base2704 {
abstract class AICar() {
// 1. 具体属性
var name: String = "car"
val color: String = "black"
// 2. 具体方法
def run(): Unit = {
println(" AICar run......")
}
// 3. 抽象属性 - 没有属性值
var price: Double
// 4. 抽象方法 - 没有方法体
def autoRun(): Unit
}
class XiaoMi extends AICar {
// 重写
// 1. 具体属性
name = "小米" // 对于var的属性,直接覆盖
// 2. 具体方法
override def run(): Unit = {
println("小米 run.....")
}
// 实现
// 3. 实现抽象属性
var price = 28.8
// 4. 实现抽象方法
def autoRun(): Unit = {
println("小米自动驾驶")
}
}
def main(args: Array[String]): Unit = {
var c1 = new XiaoMi()
c1.autoRun()
c1.run()
println(c1.name)
println(c1.color)
}
}
运行结果
代码解析
-
抽象类可以包含四种成员:
- 具体属性:已初始化的属性
- 具体方法:已实现的方法
- 抽象属性:只有声明没有初始化的属性
- 抽象方法:只有声明没有实现的方法
-
子类必须实现所有抽象成员
-
具体成员可以继承或重写