Scala中的接口,可以有抽象属性和方法,也可以有具体的属性和方法

1.1 基本语法

  1. trait X{
  2. //声明属性
  3. var name:String = _
  4. //声明方法
  5. def eat():Unit={
  6. }
  7. //抽象属性
  8. var age:Int
  9. //抽象方法
  10. def say():Unit
  11. }
  12. class P extends X with Y with Z{
  13. }

1.2 特质叠加

从最右边声明继承的父类开始调用 此时关系(叠加)变成 D -> C -> B -> A

  1. trait A{
  2. def say(): Unit ={
  3. print("-A")
  4. }
  5. }
  6. trait B extends A{
  7. override def say(): Unit = {
  8. print("-B")
  9. super.say()
  10. }
  11. }
  12. trait C extends A{
  13. override def say(): Unit = {
  14. print("C")
  15. super.say()
  16. }
  17. }
  18. class D extends B with C{
  19. override def say(): Unit = {
  20. print("D-")
  21. super.say()
  22. }
  23. }
  1. object Test02_Demo {
  2. def main(args: Array[String]): Unit = {
  3. val d = new D
  4. d.say()
  5. }
  6. }

image.png

1.3 特质自身类型

可以实现依赖注入功能,能够将该类的所有属性和函数都引入

  1. class User(var name:String){
  2. }
  3. trait A1{
  4. def say(user:User): Unit ={
  5. println("A say =>"+user.name)
  6. }
  7. }
  8. trait B1{
  9. _ : A1 =>
  10. // def say(user:User): Unit ={ .... }
  11. def run(user:User): Unit ={
  12. println("B run =>"+user.name)
  13. say(user)
  14. }
  15. }
  16. object Test03_Demo extends A1 with B1{
  17. def main(args: Array[String]): Unit = {
  18. run(new User("zs"))
  19. }
  20. }

1.4 特质和抽象类的选择

  • 一般选择特质,能够多继承
  • 如果需要有参数的构造方法就选择抽象类