scala抽象类

57 阅读3分钟

在 Scala 编程中,抽象类是面向对象设计的重要工具。它像一个 “蓝图的蓝图”,自身不能直接创建对象,却能为子类定义规范、提供通用功能。

一、抽象类的核心特性

抽象类用 abstract 关键字修饰,它有两个关键特点:

  • 不能直接实例化:比如我们定义的 ATCar 抽象类,无法通过 new ATCar() 来创建对象。
  • 可包含抽象方法:抽象方法只有声明(无函数体),必须由子类实现。同时,抽象类也可以包含有具体实现的 “普通方法”。

代码如下

package level02
/*
* 抽象类 abstract
* 1.一个抽象类,不能被new
* 一个类不能直接用来创建对象,那么这个类具体有什么用呢?做别人的父亲!
* 2.可以定义抽象方法,在子类中实现
*/
object class11 {
  abstract class ATCar {
    //抽象方法:没有具体的函数代码
    def autoEn():Unit
    //具体方法
    def autoDrive () :Unit ={
      println("具体方法,自动驾驶....")
    }
  }
  //在子类中,一定要去实现父类的所有抽象方法
  class SU7 extends ATCar {
    //使用override去实现这个方法
    override def autoEn(): Unit = {
      println(s"采用小米独家的无线充电技术,停车就可以充电")
    }
  }
  def main(args: Array[String]): Unit = {
//    val car1 = new ATCar()
      val SU = new SU7()
      SU.autoDrive()
      
  }
}

二、抽象类的 “双抽象” 能力:属性与方法的契约式约束

抽象类的核心价值在于 “只定义规范,不提供具体实现”,这种规范既可以是方法,也可以是属性

  • 抽象方法:仅声明方法签名,无函数体,强制子类实现具体逻辑。
  • 抽象属性:仅声明属性的类型(无初始值),强制子类提供具体赋值。
package level02

/*
* 抽象类 abstract
* 1.一个抽象类,不能被new
* 一个类不能直接用来创建对象,那么这个类具体有什么用呢?做别人的父亲!
* 2.可以定义抽象方法,在子类中实现
*
* 3.一个抽象类中可以有:
* 1.具体属性 val name: String = "小米"
* 2.具体方法  def autoRun():Unit = {}
* 3.抽象属性 val name: String 没有具体值的属性。只有属性名和类型。它必须写在抽象类中
* 4.抽象方法 def autoRun():Unit
*          在子类中要有具体的实现
*/

object class12 { // 修正:添加大括号,将类和方法包含在object内

  abstract class ATCar() {
    val name: String
    def autoRun():Unit
  }
  class XiaoMi extends ATCar {
    val name: String = "xiaomi"
    def autoRun():Unit = {
      println("小米汽车,自动驾驶.....")
    }
  }
  def main(args: Array[String]): Unit = {
    val car1 = new XiaoMi()
    car1.autoRun()
  }
}

三、抽象类的 “双重能力”:规范与复用的统一

抽象类的核心价值在于同时具备 “约束性” 和 “复用性”:

  • 约束性:通过抽象属性抽象方法,强制子类实现业务特有的逻辑(如汽车的 “价格” 和 “自动驾驶行为”)。
  • 复用性:通过具体属性具体方法,封装通用逻辑(如汽车的 “基础名称” 和 “默认运行行为”),让子类直接继承复用。
package level02

/*
* 抽象类 abstract
* 1.一个抽象类,不能被new
* 一个类不能直接用来创建对象,那么这个类具体有什么用呢?做别人的父亲!
* 2.可以定义抽象方法,在子类中实现
*
* 3.一个抽象类中可以有:
* 1.具体属性 val name: String = "小米"
* 2.具体方法  def autoRun():Unit = {}
* 3.抽象属性 val name: String 没有具体值的属性。只有属性名和类型。它必须写在抽象类中
* 4.抽象方法 def autoRun():Unit
*          在子类中要有具体的实现
*/

package level02

object class13 {

  abstract class ATCar {
    // 1. 具体属性
    var name: String = "car"
    val color: String = "default"

    // 2. 具体方法
    def run(): Unit = {
      println("run....")
    }

    // 3. 抽象属性
    var price: Double
    // 4. 抽象方法
    def autoRun(): Unit
  }

  class Xiaomi extends ATCar {
    // 重写具体属性
    name = "小米"
    override val color: String = "流光紫"

    // 重写具体方法
    override def run(): Unit = {
      println("小米 run.....")
    }

    // 实现抽象属性
    override var price: Double = 28.8
    // 实现抽象方法
    override def autoRun(): Unit = {
      println("小米自动碾接")
    }
  }

  def main(args: Array[String]): Unit = {
    val c1 = new Xiaomi()
    c1.autoRun()
    c1.run()
    println(c1.name)
    println(c1.color)
    println(c1.price)
  }
}