18_Scala面向对象编程trait

ops/2024/11/14 6:30:55/

文章目录

  • 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 selectuser.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.ppmy.cn/ops/34077.html

相关文章

SQL注入基础-5

一、Access注入 1、asp网站常用数据库:access,mssql 2、access数据库 (1)没有库,没有端口 (2)结构:表--》字段--》数据 3、注入流程: 判断类型判断表名:遍历、爆破判断列名判断列名下的数据长度查出数…

Crossplane 实战:构建统一的云原生控制平面

1 什么是 Crossplane Crossplane 是一个开源的 Kubernetes 扩展,其核心目标是将 Kubernetes 转化为一个通用的控制平面,使其能够管理和编排分布于 Kubernetes 集群内外的各种资源。通过扩展 Kubernetes 的功能,Crossplane 对 Kubernetes 集群…

DS:顺序表、单链表的相关OJ题训练(1)

欢迎各位来到 Harper.Lee 的学习小世界! 博主主页传送门:Harper.Lee的博客主页 想要一起进步的uu可以来后台找我交流哦! 在DS:单链表的实现 和 DS:顺序表的实现这两篇文章中,我详细介绍了顺序表和单链表的…

【protobuf】protobuf 开发 (二)

紧接着上一篇文章https://blog.csdn.net/qq_37387199/article/details/137890740 获取丢失的代码 拿到丢失的源代码需要去 Google 的 protobuf GitHub 仓库,地址在 https://github.com/protocolbuffers/protobuf 可以下载压缩包,也可以使用 Git 克隆。…

Mac基于Docker-ubuntu构建c/c++编译环境

编译环境安装和使用被充分验证,如有期望补充的内容欢迎留言评论。 目录 前言 Docker desktop下载安装 修改镜像源 选择ubuntu镜像 docker容器启动 参数说明: 宿主机与docker容器文件共享 宿主机与docker容器拷贝文件 为 Ubuntu 配置 ssh、vim、make 相关工…

Qt 绘图(学习记录)

1. QT 绘图中创建画家类 QPainter提供了高度优化的功能,以完成大多数绘图GUI程序所需的功能。它可以画任何东西,从简单的线条到复杂的形状,如馅饼和和弦。它还可以绘制对齐的文本和像素图。通常,它绘制一个“自然”坐标系&#…

【Micropython Pitaya Lite教程】烧录固件

文章目录 前言一、编译固件源码二、烧录固件总结 前言 MicroPython是一种精简的Python 3解释器,可以在微控制器和嵌入式系统上运行。Pitaya Lite是一款基于ESP32的微控制器开发板,它结合了低功耗、Wi-Fi和蓝牙功能。结合MicroPython和Pitaya Lite&#…

【Python项目】基于opencv的的【疲劳检测系统】

技术简介:使用Python技术、OpenCV图像处理库、MYSQL数据库等实现。 系统简介:用户可以通过登录系统平台实现实时的人脸照片的拍摄和上传,结合上传图像的内容进行后台的图像预处理和运算分析,用户可以通过照片分析界面查看到当前检…