18_Scala面向对象编程trait

文章目录

  • 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.mzph.cn/news/832094.shtml

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

相关文章

练习题(2024/5/3)

1对称二叉树 给你一个二叉树的根节点 root , 检查它是否轴对称。 示例 1: 输入:root [1,2,2,3,4,4,3] 输出:true示例 2: 输入:root [1,2,2,null,3,null,3] 输出:false提示: 树中…

(论文阅读-优化器)A Cost Model for SPARK SQL

目录 Abstract 1 Introduction 2 Related Work 3 Background and Spark Basics 4 Cost Model Basic Bricks 4.1 Cluster Abastraction and Cost Model Parameters 4.2 Read 4.3 Write 4.4 Shuffle Read 4.5 Broadcast 5 Modeling GPSJ Queries 5.1 Statistics and S…

qwen-vl微调

1.数据格式转换 模版格式: [{"id": "identity_0","conversations": [{"from": "user","value": "你好"},{"from": "assistant","value": "我是Qwen-V…

C语言共享内存

windows下实现共享内存 进程A写入共享内存&#xff1a; #include <stdio.h> #include <windows.h>int main() {// 创建或打开共享内存对象HANDLE hMapFile CreateFileMapping(INVALID_HANDLE_VALUE,NULL,PAGE_READWRITE,0,4096, // 内存大小&#xff0c;这里为4…

QT+网络调试助手+TCP客户端

一、网络调试助手UI界面 编程主要思路&#xff1a; 首先将水平的控件 水平布局 &#xff0c;然后相对垂直的控件 垂直布局 &#xff0c;哪怕是底下的groupBox也需要和里面的内容 水平布局&#xff0c;然后最后框选全部 栅格布局。如果需要界面自适应窗口大小&#xff0c…

在Ubuntu 24.04 LTS (Noble Numbat)上搭建Kubernetes集群

准备工作 系统准备 主机和IP地址准备 ​编辑安装步骤 安装前准备 关闭防火墙 设置服务器时区 关闭 swap 分区 关闭SELinux 配置hosts配置文件 转发 IPv4 并让 iptables 看到桥接流量 每台机器设置hostname 安装容器运行时 安装Kubernetes 配置并安装apt包 初始…

Android Studio学习笔记——数据库存储

Android Studio学习笔记——数据库存储 6.1持久化技术简介6.2 文件存储将数据存储到文件中从文件中读取数据 6.3 SharedPreferences存储6.3.1 将数据存储到是SharedPreferences中6.3.2 从SharedPreferences中读取数据6.3.3 实现记住密码功能 6.4 SQLite数据库存储6.4.1 创建数据…

【白话机器学习系列】白话特征向量

白话特征向量 一个方阵 A A A 与列向量 v v v 的乘积会生成一个新的列向量。这个新向量通常与原向量有着不同的方向&#xff0c;矩阵在这里代表一个线性变换。然而&#xff0c;某些向量会保持其原始方向。我们称这种向量为矩阵 A A A 的特征向量&#xff08;eigenvector&…

03_led_horse_run_v1 跑马灯

03_led_horse_run_v1 在Verilog中实现跑马灯通常涉及到使用一个计数器来控制LED灯的亮灭顺序。 跑马灯是一种常见的电子显示方式&#xff0c;它通过控制多个LED灯的顺序点亮&#xff0c;形成一种动态的视觉效果&#xff0c;看起来就像灯在“跑”一样。 更新 使用dip开关控制…

一键 input 苹果 OpenELM,零门槛 Llama 3 教程,40+ 优质模型/数据集/教程,建议收藏!...

现在 AI 行业什么最火&#xff1f; 「大模型」一定仍然排在前三甲的位置。 自从 2022 年底 ChatGPT 面世以来&#xff0c;大模型在各行各业已经带来了太多的惊喜&#xff0c;应用场景愈发丰富&#xff0c;同时也带动了相关底层技术的普及与普适化。尤其是在开源模型繁荣发展之下…

描述Nacos中服务发现的流程。

Nacos中服务发现的流程解析 在微服务的架构体系中&#xff0c;服务发现是一个至关重要的组成部分。它解决了服务提供者和消费者之间如何动态发现对方地址的问题&#xff0c;使得微服务之间的调用更加灵活和高效。在众多服务发现组件中&#xff0c;Nacos以其易用性、高性能和丰…

C#核心之面向对象-多态

面向对象-多态 文章目录 1、Vob1、多态的概念2、多态的实现 2、抽象类和抽象方法1、抽象类2、抽象方法 3、接口1、接口的概念2、接口的声明3、接口的使用4、接口可以继承接口5、显示实现接口总结思考 电脑使用USB接口读取数据 4、密封方法 1、Vob 1、多态的概念 多态&#xf…

本周10个Github有趣项目WebLlama等

10个Github有趣的项目、工具和库 1、WebLlama Llama-3 网络Web代理&#xff0c;这是使用 Llama 3 构建的最强大的代理&#xff0c;通过聊天对话实现Web导航&#xff0c;可以按照说明浏览网页并与您交谈。 在Llama-3-8B-Web性能上超过了 GPT-4V&#xff08;*零样本&#xff09;…

为什么选择OpenNJet?OpenNJet下一代云原生应用引擎!OpenNJet开发实战!

前言导读 在当今这个数字化转型加速的时代&#xff0c;云原生技术已成为企业和开发者构建现代应用的首选路径。OpenNJet作为新一代云原生应用引擎&#xff0c;在国内外技术社区受到了广泛关注。 本文将深入探讨OpenNJet的特点、优势以及在开发实践中的应用&#xff0c;带您全…

【YoloDeployCsharp】基于.NET Framework的YOLO深度学习模型部署测试平台-源码下载与项目配置

基于.NET Framework 4.8 开发的深度学习模型部署测试平台,提供了YOLO框架的主流系列模型,包括YOLOv8~v9,以及其系列下的Det、Seg、Pose、Obb、Cls等应用场景,同时支持图像与视频检测。模型部署引擎使用的是OpenVINO™、TensorRT、ONNX runtime以及OpenCV DNN,支持CPU、IGP…

用python画一个正八边形

1 问题 使用turtle库的turtle.fd()函数和turtle.seth()函数绘制一个边长100的正八边形。 2 方法 1、利用for循环解决如何画出图形中相同的八条边的问题。 2、再利用turtle.fd()函数和turtle.seth()函数画出完整的图形。 代码清单 1 import turtleturtle.pensize(2)d0for i in r…

【系统架构师】-选择题(十三)

1、在某企业的营销管理系统设计阶段&#xff0c;属性"员工"在考勤管理子系统中被称为"员工"&#xff0c;而在档案管理子系统中被称为"职工"&#xff0c;这类冲突称为&#xff08; 命名冲突&#xff09;。 同一个实体在同系统中存在不同的命名&am…

智慧旅游引领未来风尚,科技助力旅行更精彩:科技的力量推动旅游业创新发展,为旅行者带来更加便捷、高效和智能的旅行服务

目录 一、引言 二、智慧旅游的概念与特点 &#xff08;一&#xff09;智慧旅游的概念 &#xff08;二&#xff09;智慧旅游的特点 三、科技推动旅游业创新发展 &#xff08;一&#xff09;大数据技术的应用 &#xff08;二&#xff09;人工智能技术的应用 &#xff08;…

推荐收藏!40 道算法工程师必问的高频面试题!

节前&#xff0c;我们组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、参加社招和校招面试的同学。 针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。 合集&#xff1a…

【计算机科学速成课】笔记二

笔记一 文章目录 7.CPU阶段一&#xff1a;取指令阶段阶段二&#xff1a;解码阶段阶段三&#xff1a;执行阶段 8.指令和程序9.高级CPU设计——流水线与缓存10.早期编程方式11.编程语言发展史12.编程原理13.算法入门14.数据结构15.阿兰图灵 7.CPU CPU也叫中央处理器&#xff0c;…