• 【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)
    }
  • 相关阅读:
    口罩预约管理系统——系统网站实现(前端+PHP+MySQL)
    口罩预约管理系统——数据库设计(前端+PHP+MySQL)
    购书网站前端实现(HTML+CSS+JavaScript)
    HMM隐马尔可夫模型来龙去脉(二)
    Linux环境编程进程间通信机制理解
    Linux基本命令及编程环境实验
    大数据技术
    ModuleNotFoundError: No module named '_ctypes'的解决方案
    page-break-inside,page-break-before 分页
    C.char字符串的拼接和const char*的转换
  • 原文地址:https://www.cnblogs.com/mindzone/p/15003018.html
Copyright © 2020-2023  润新知