【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) }