zoukankan      html  css  js  c++  java
  • 【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)
    }
  • 相关阅读:
    ESLint 配置说明
    ThinkPhp 更改 BIT 类型的问题
    sql server management studio 查询的临时文件路径
    Excel分组快速自动填充编号
    ThinikPhp 将数据库模型的增、删、改操作写入日志
    Window 任务栏清除历史记录
    vscode 中使用php-cs-fixer和PHP Formatter 插件规范化PHP代码
    ThinkPhp 使用PhpExcel导出导入多语言文件
    [UE4]抛物线指示器
    [UE4]瞬移
  • 原文地址:https://www.cnblogs.com/mindzone/p/15003018.html
Copyright © 2011-2022 走看看