18_Scala面向对象编程trait

news2024/12/26 22:24:18

文章目录

  • trait
  • 1.定义trait
  • 2.向类中混入特质
    • 2.1没有父类
    • 2.2有父类
  • 3.动态混入
    • 3.1动态混入查询功能到公司业务中
  • 4.父类,子类,特质初始化优先级
  • 5.Scala功能执行顺序
  • 6.常用API

trait

–特质的学习需要类比Java中的接口,源码编译之后就是interface

–scala中没有接口的概念;

–scala可以将多个对象中相同的特征从对象剥离出来,形成一个独立的语法结构 => 特质trait
如果一个对象符合这个特质,那么可以将特质混入到这个对象中

–目的:增加约束,功能补充和叠加

–如果混入多个相同的特质,为避免出现钻石问题,需要定义一个执行的顺序

1.定义trait

trait Run{
  def run():Unit 
}

特质中的方法是抽象方法(模板)

2.向类中混入特质

–如果有父类,采用with
–如果没有父类,采用extends
–混入多个特质,第一个用extends其余都用with

2.1没有父类

class Cat extends Run {

  override def run(): Unit = println("Cat run")
}

2.2有父类

class Stu extends person with Run {
  override def run(): Unit = println("Stu run")
}

class person{}

–混入特质需要重写特质的所有抽象方法

–scala中抽象方法不需要定义,没有方法体就是抽象方法,抽象类需要加abstract

–学习时候要类比Java接口,但是特质可以继承类,接口不行

3.动态混入

–引入目的:方便程序开发OCP原则;
–开发程序代码:空难扩展开放OPEN,功能修改关闭CLOSE
–注意:OCP原则不要拿父类继承来 做OCP原则,原因是父类继承,是一种模板思想,而非程序OCP思想
–OCP原则最佳使用trait,在构建对象的时候,将新的功能混入到对象中

3.1动态混入查询功能到公司业务中

//  3.trait动态混入   也就是构建对象的时候用with进行功能混入;
class Accompany{
  val user = new User() with select
  user.selectUser()
}
trait select{
  def selectUser(): Unit = {
    println("select * from emp_user")
  }
}

小结:动态混入也就是构建对象的时候直接使用with混入特质

4.父类,子类,特质初始化优先级

trait > current class

parent > trait > current class

多个特质情况下,从左到右依次执行

left trait > right trait

5.Scala功能执行顺序

–类混入特质也存在钻石问题,但是scala采用了一种特殊的方式–功能叠加
–如果混入多个相同的特质,为避免出现钻石问题,需要定义一个执行的顺序
“此处的执行顺序就是初始化顺序的反向操作”

执行顺序跳级到xxx
前提需要有继承关系
super[xxx].operateDate()    跳级执行操作
trait Operate {
  def operatedata(): Unit = {
    println("处理数据")
  }
}

trait Database extends Operate {
  override def operatedata(): Unit = {
    print("Database")
    super.operatedata() //整体意思就是Database处理数据
  }
}

trait Log extends Operate {
  override def operatedata(): Unit = {
    print("Log   ")
    //此处的super表示上一级的super 此处上一级为DataBase,原因是功能一层一层包     特质中,重写的方法中使用super表示上一级
    super.operatedata()
  }
}

//上述所示,Database和Log两个都继承自Operate; MySQL同时继承自Databse和Log
class MySQL extends Database with Log { //Log   Database处理数据    结果没有意义
  //实例化MySQL对象,后       父类 特质等方法直接可以调用,不需要重写
}

//Log Database处理数据

图解如下

在这里插入图片描述

注意要点:

1.特质就是扩展功能,一级一级的扩展;

2.即便是特质的扩展也是优先初始化父类;

3.初始化完成后调用的时候是由外向内一层一层调用;

4.可以进行跳级调用 super[xxx].operaterData();

在这里插入图片描述

6.常用API

//  判断对象是否是某个类的实例
println(mysql.isInstanceOf[Operate])    //true
//  将对象转化为某个类的实例
val value1 = mysql.asInstanceOf[Object]
println(value1)       //_18Scala面向对象编程trait.Demo02$MySQL@19bb089b
//  获取类的信息
val value = classOf[Operate]
println(value)        //interface _18Scala面向对象编程trait.Demo02$Operate

Scala中

双等号 表示非空equals

equals 表示比较内存

但是一般情况下,比较对象,都是重写equals方法,完成自定义的比较功能

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1644189.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【DPU系列之】Bluefield 2 DPU卡的功能图,ConnectX网卡、ARM OS、Host OS的关系?(通过PCIe Switch连接)

核心要点: CX系列网卡与ARM中间有一个PCIe Swtich的硬件单元链接。 简要记录。 可以看到图中两个灰色框,上端是Host主机,下端是BlueField DPU卡。图中是BF2的图,是BF2用的是DDR4。DPU上的Connect系列网卡以及ARM系统之间有一个…

解决Maven本地仓库存在依赖包还需要远程下载的问题

背景 公司有自己maven私服,正在在私服可以使用的情况,打包是没问题的。但是这次是由于公司大楼整体因电路检修而停电,所有服务器关机,包括maven私服服务器。然后当天确有一个包需要打,这个时候发现死活打不了&#xf…

学习3:scrapy请求对象、模拟登录、POST请求、管道的使用、crawlspider爬虫类

请求对象 请求对象参数 scrapy.Request(url[],callback,method"GET",headers,body,cookies,meta,dont_filterFalse)callback 表示当前的url响应交给那个函数去处理method 指定请求方式headers 接受一个字典,其中不包括cookiesbody 接收json字符串&#…

vs 2022 Xamarin 生成 Android apk

再保存,如果没有生成apk就重启软件 再试一次

【hive】transform脚本

文档地址:https://cwiki.apache.org/confluence/display/Hive/LanguageManualTransform 一、介绍二、实现1.脚本上传到本地2.脚本上传到hdfs 三、几个需要注意的点1.脚本名不要写全路径2.using后面语句中,带不带"python"的问题3.py脚本Shebang…

list 的模拟实现

目录 1. list 的实现框架 2. push_back 3. 迭代器 4. constructor 4.1. default 4.2. fill 4.3. range 4.4. initializer list 5. insert 6. erase 7. clear 和 destructor 8. copy constructor 9. operator 10. const_iterator 10.1. 普通人的处理方案 10.2. …

基于Java EE平台项目管理系统的设计与实现(论文 + 源码)

【免费】基于javaEE平台的项目管理系统.zip资源-CSDN文库https://download.csdn.net/download/JW_559/89267688 基于Java EE平台项目管理系统的设计与实现 摘 要 随着社会信息化的发展,很多的社会管理问题也一并出现了根本性变化,项目公司的报表及文…

Linux网络部分——DHCP、FTP

目录 一、DHCP动态主机配置协议 1. DHCP工作原理(流程) 2. 使用DHCP的好处 3.DHCP的分配方式 4.DHCP安装和配置【☆】 二、FTP文件传输协议 1. FTP传输模式 2.FTP安装与配置【☆】 3. FTP设置白名单和黑名单【☆】 一、DHCP动态主机配置协议 DH…

自动驾驶融合定位系列教程五:惯性导航误差分析

自动驾驶融合定位系列教程五:惯性导航误差分析 一、概述 在定位领域的几乎所有多传感器融合系统中,都有IMU存在,而且,IMU是定位系统的主线与核心(对此可能很多人并不同意,但是我仍然坚定地坚持这一观点&a…

GPU通用计算介绍

谈到 GPU (Graphics Processing Unit,图形显示卡)大多数人想到的是游戏、图形渲染等这些词汇,图形处理确实是 GPU 的一大应用场景。然而人们也早已关注到它在通用计算上的巨大潜力,并提出了 GPGPU (General-purpose co…

【精品毕设推荐】基于JSP物流信息网的设计与实现

点击免费下载原文及代码、PPT 摘要 本文讲述了基于JSP物流信息网的设计与实现。该系统使用java语言开发,使系统具有更好的平台性和可扩展性。 该系统实现了用户登录、注册、查询快递信息、快递公司注册成为合作伙伴以及系统管理员对信息进行管理等功能。系统的主…

【网络原理】HTTPS 的工作过程

系列文章目录 【网络通信基础】网络中的常见基本概念 【网络编程】网络编程中的基本概念及Java实现UDP、TCP客户端服务器程序(万字博文) 【网络原理】UDP协议的报文结构 及 校验和字段的错误检测机制(CRC算法、MD5算法) 【网络…

libcity笔记:参数设置与参数优先级

1 参数优先级 高优先级的参数会覆盖低优先级的同名参数 Libcity中的优先级顺序维: 命令行参数(命令行python run_model.py时导入的) > 用户定义配置文件(命令行python run_model.py时由config_file导入的) >…

变老相机app

变老相机app 在手机上使用“变老相机”app,其中的时光穿梭功能可以生成10岁、20岁、50岁、70岁的照片 目的 得到未来自己的照片,能够更有效地督促我们为老年的自己存款。

CMakeLists.txt语法规则:改变行为的变量说明二

一. 简介 前面一篇文章学习了 CMakeLists.txt语法中的 部分常量变量,具体学习提供信息的变量,文章如下: CMakeLists.txt语法规则:提供信息的变量说明一-CSDN博客 CMakeLists.txt语法规则:提供信息的变量说明二-CSD…

苍穹外卖项目---------收获以及改进(1-2天)

①Nginx反向代理 概念&#xff1a; 优点&#xff1a; 反向代理配置方式&#xff1a; 负载均衡配置方式&#xff1a; ②MD5加密,使用Hutool工具 ③ThreadLocal 封装线程操作的类&#xff1a; //线程操作封装类 public class BaseContext {public static ThreadLocal<Long>…

EasyImage2.0 简单图床开源源码

特点 支持API 支持仅登录后上传 支持设置图片质量 支持压缩图片大小 支持文字/图片水印 支持设置图片指定宽/高 支持上传图片转换为指定格式 支持限制最低宽度/高度上传 支持上传其他文件格式 在线管理图片 支持网站统计 支持设置广告 支持图片鉴黄 支持自定义代码 支持上传IP…

CI/CD笔记.Gitlab系列.新用户管理

CI/CD笔记.Gitlab系列 新用户管理 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:https://blog.csdn.net/qq_285502…

Linux —— 信号初识

Linux —— 信号初识 什么是信号测试几个信号signal函数函数原型参数说明返回值注意事项示例 后台程序前台转后台检测输入中断向量表 我们今天来继续学习Linux的内容&#xff0c;今天我们要了解的是Linux操作系统中的信号&#xff1a; 什么是信号 信号是操作系统内核与进程之…

45. UE5 RPG 增加角色受击反馈

在前面的文章中&#xff0c;我们实现了对敌人的属性的初始化&#xff0c;现在敌人也拥有的自己的属性值&#xff0c;技能击中敌人后&#xff0c;也能够实现血量的减少。 现在还需要的就是在技能击中敌人后&#xff0c;需要敌人进行一些击中反馈&#xff0c;比如敌人被技能击中后…