玩转scala抽象类

33 阅读4分钟

在Scala的编程江湖里,抽象类就像一位爱操心的“家长”,总想给子类定下规矩:“孩子啊,你得继承我的基因,还得按我的方式活!”可子类们偏偏不买账,有的偷偷改头换面,有的直接“离家出走”,上演了一出出代码界的“亲子鉴定”大戏。今天,咱们就一起走进这场闹剧,看看抽象类是如何在Scala的世界里“翻车”又“逆袭”的!

(一)抽象类

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

eg1:


package level02
/**
 * 抽象类 abstract
 * 1. 一个抽象类(加了abstract修饰的),不能被new.
 * 一个类不能直接用来创建对象,那么这个类具体有什么用呢?做别人的父类!
 */

object class06 {
  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()
  }
}

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

eg2:


package level02
/**
 * 抽象类 abstract
 * 1. 一个抽象类(加了abstract修饰的),不能被new.
 * 一个类不能直接用来创建对象,那么这个类具体有什么用呢?做别人的父类!
 * 2可以定义抽象方法,在子类中去实现
 */

object class06 {
  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.autoDrive()
  }
}

image.png

(三) 一个抽象类中可以有:

  • 1.具体属性 val name:String= "小米"
  • 2.具体方法
  • 3.抽象属性 没有具体值的属性。只有属性名和类型。他必须写在抽象类中
  • 4.抽象方法 def autoRun():Unit 在子类中,要有具体的实现

eg3:

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

object class06 {
  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 = {
    val car1 =new XiaoMi

      car1.autoRun()
  }
}

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

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

    // 3. 抽象属性(无初始值)
    var price: Double

    // 4. 抽象方法(无方法体)
    def autoRun(): Unit
  }

  // 子类实现抽象类
  class XiaoMiCar extends AICar {
    // 重写具体属性:var属性直接赋值,val属性需加override
    name = "小米"
    override val color: String = "流光紫"

    // 实现抽象属性
    var price: Double = 28.8

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

    // 实现抽象方法
    def autoRun(): Unit = {
      println("小米自动驾驶")
    }
  }

  // 主方法
  def main(args: Array[String]): Unit = {
    val car = new XiaoMiCar()
    car.run()         // 输出:小米 run...
    car.autoRun()     // 输出:小米自动驾驶
    println(car.price) // 输出:28.8
  }
}
  • 完结撒花 !!!!!!!!!!
  • 制作不易 希望·一键三连 在此感谢关注的粉丝宝宝
  • 新来的宝宝可以关注下主播哟!!!!!