【Scala】05 对象特性Part2

特质重复继承关系 

父类特质 A

子类特质B 继承 A

子类特质C 继承A

类D 继承了 B 又实现了 C

class D extends B with C

继承顺序是 D 继承 C 继承 B 继承 A

 

特质和抽象类的区别?

1、可扩展性不同

只能扩展一个抽象类,但是扩展特质是支持多个特质

对于一些功能性对象需要高可扩展性的场景使用特质

2、初始化生命周期时的处理场景

特质只有无参构造,不支持参数化构造创建,抽象类可以实现这个场景需求

 

特质更多的是像一个类,一个普通类A实现特质B的时候,一个的时候是直接extends就可以完成

class A extends B with C {
  override def abMethod(): Unit = {
    
  }

  override def abMethod2(): Unit = {
    
  }
}
trait B {
  def abMethod() : Unit
}

trait C {
  def abMethod2() : Unit
}

 文档:

https://docs.scala-lang.org/zh-cn/tour/traits.html

 

特质自身类型

实现类型和子类统一,

子类可以通过相同的自身类型调用特质方法

package cn

object HelloScala {
  def main(args: Array[String]): Unit = {
    val user = new Register("zhangSan", "123456")
    user.insertRecord()
  }
}

class Account(val username : String, val password : String)

trait AccountDao {
   _ : Account => // 定义自身类型为 Account


  def insertRecord() : Unit = {
    println(s"insert into db : ${this.username}, ${this.password}")
  }
}

class Register(username : String, password : String) extends Account(username, password) with AccountDao

类型判断和转换

package cn

object HelloScala {
  def main(args: Array[String]): Unit = {
    val b : A = new B

    println(b.isInstanceOf[B]) // true
    println(b.isInstanceOf[A]) // true 父类可以,子类也可以

    val a = b.asInstanceOf[A]
    println(a.isInstanceOf[B]) // true
    println(a.isInstanceOf[A]) // true

  }
}


class A {

}

class B extends A {

}

 

 

枚举类和应用类

package cn

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

    println(Test.SPRING)
  }
}

/**
 * 枚举类
 */
object Test extends Enumeration {
  val SPRING = Value(1, "spring")
  val SUMMER = Value(1, "summer")
  val AUTUMN = Value(1, "autumn")
  val WINTER = Value(1, "winter")
}

// 应用类, 这个类可以直接跑起来运行,相比Java和SpringBoot框架要更为简介
object TestApp extends App {
  println("App start?")

  type CustomType = String
  val a : CustomType = "adsadas"
  println(a)
}

 

posted @ 2021-07-16 10:22  emdzz  阅读(36)  评论(0编辑  收藏  举报