Scala—抽象类

52 阅读2分钟

前面我们学习了类的继承,下面我们看一种专为继承而生的类:抽象类。

一、理解抽象类

抽象类的关键字是:abstract

类本身就是对对象的抽象,抽象类就是对类的抽象,就是一种更加模糊的类。

定义: 抽象类是一个包含一个或多个抽象方法的类。抽象方法是不带任何实现的方法。抽象类也可以包含具体的方法和属性。

目的: 抽象类的主要目的是为子类提供公共的接口和部分实现,并确保子类实现抽象方法。

二、定义抽象类

定义一个Scala的抽象类:abstract class A{ }。

定义一个智能汽车类:

abstract class AICar(){  
  def autoRun():Unit  
  var name:String  
}

定义抽象属性: var|val 属性名:类型 一个属性没有初始化,没有值

定义抽象方法: def 方法名():String 只声明没有实现方法。

abstract class AICar {
  def autoDrive () :Unit = {
    println("具体方法,自动驾驶.....")
  }
}

class SU7 extends AICar {

}

def main(args: Array[String]): Unit = {

  // val car1 = new AICar ()
  val su = new SU7()
  su.autoDrive()
}

三、继承抽象类

子类继承了抽象类,它就必须去实现所有抽象属性和抽象方法

可以定义抽象方法,在子类中去实现。

abstract class AICar {
  // 抽象方法: 没有具体的函数代码。
  def autoEn():Unit

  // 具体方法
  def autoDrive () :Unit = {
    println("具体方法,自动驾驶.....")
  }
}


class SU7 extends AICar {

  // 使用override 去实现这个方法
  override def autoEn(): Unit = {
    println(s"采用小米独家的无线充电技术,停车就可以充电")
  }
}

def main(args: Array[String]): Unit = {

  // val car1 = new AICar ()
  val su = new SU7()
  su.autoEn()
}

一个抽象类中可以有:

*(1)具体属性 val name:String = "小米"

*(2)具体方法

*(3)抽象属性:val name:String 没有具体值的属性。只有属性名和类型。它必须写在抽象类中

*(4)抽象方法;def autoRRun():Unit

四、抽象类重写

如果子类中对抽象类中的方法定义不满意,仍可以使用override去覆盖的。

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的属性,直接覆盖
  override val color = "流光紫" // 对于val的属性,要添加override
  // 2.具体方法
  override def run(): Unit = {
    println("小米 run.....")
  }
  // 实现
  // 3.实现 抽象属性
  val 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)
}