Scala学习(七)---面向对象特质

news2024/11/25 20:24:28

文章目录

  • 1.面向对象特质(Trait)
  • 2.特质声明
      • 2.1 特质的特点
      • 2.2 特质冲突
      • 2.3 特质叠加
      • 2.4 特质自身类型
      • 2.5 特质和抽象类的区别
      • 扩展

1.面向对象特质(Trait)

在Scala语言中,采用特质trait(特征)来代替接口的概念,也就是说,多个类具有相同的特质的时候,就可以将这个特质独立出来,采用关键字trait声明。
Scala中的trait可以拥有抽象属性和方法,也可以拥有具体的属性和方法,一个类可以混入多个特质(trait),这种感觉相对于Java的抽象类
Scala引入trait特征,第一用来替代Java的接口,第二也就是对单继承机制的一种补充。

2.特质声明

一个类具有某种特质,就意味着这个类满足了这个特质的所有要素,所以在使用的时候,也采用了extends关键字,如果有多个特制或者存在父类,那么需要采用with关键字进行连接。
基本语法:
没有父类:class 类名 extends 特质1 with 特质2 with 特质3…
有父类:class 类名 extends 父类 with 特质1 with 特质2 …

class TestTrait {

}
object TestTrait
{
  def main(args: Array[String]): Unit = {
    
  }
}

//定义一个特质
trait Age09{
  //抽象的属性和方法
  val age:Int
  def sayHi():Unit
  
  //具体的属性和方法
  val age1:Int=10
  def sayHi1():Unit=println("hi age")
}

trait young09{
  
}

class Father01{
  
}

//实现特质
//有父类的情况
class Children01 extends Father01 with Age09 with young09 {
  override val age: Int = 21

  override def sayHi(): Unit = "hello"
}

//没有父类的情况
class Children02 extends Age09 with young09 {
  override val age: Int = 18

  override def sayHi(): Unit = "hello "
}

2.1 特质的特点

a.特质可以同时拥有抽象方法和具体方法
b.动态混入:可灵活的扩展类的功能
c.动态混入:创建对象的时候混入trait,而无需使类混入该特质
d.如果混入的trait有未实现的方法,则需要实现

2.2 特质冲突

当一个类继承的父类和特质有同样的具体属性或者方法时候,调用此属性或者方法时,会报错,此时需要重写属性或者方法来解决冲突。如果属性使用var来修饰,则冲突就无法解决,因为在scala中var修饰的属性不可以重写。


object TestTrait02{
  def main(args: Array[String]): Unit = {
    val child0 = new Child03
    println(child0.age)
  }
}

trait TraitDemo1{
  val age:Int=11
}

//父类
class Father03{
  val age:Int=12
}

//子类
class Child03 extends Father03 with TraitDemo1 {

}

在这里插入图片描述

2.3 特质叠加

在这里插入图片描述
sub类混入的两个特质TraitA和TraitB,而这两个特质又同时继承了TraitC特质,此种情况称为特质的叠加。

class TestTrait03 {

}
object TestTrait03{
  def main(args: Array[String]): Unit = {
    val sub0 = new sub
    println(sub0.info())
  }
}
trait TraitC{
  val age:Int
  def info():String={
    "age"
  }
}
trait TraitB extends TraitC {
  override val age:Int=12
  override def info():String={
    "young"+super.info()
  }
}
trait TraitA extends TraitC {
  override val age:Int=62

  override def info(): String = {
    "old" + super.info()
  }
}
class sub extends TraitB with TraitA {
  override def info():String="person is"+super.info()
}

在这里插入图片描述
可以看到,当一个类中混入多个特质的时候,scala会对所有的特质及其父特质进行一定的顺序进行排序,在上述例子中的顺序为TraitA–>TraitB–>TraitC,这相当于类在混入特质的顺序的倒序class sub extends TraitB with TraitA
如果想要调用某个指定的混入特质的方法,可以使用super[].方法来实现

super[TraitB].info()

2.4 特质自身类型

当一个类混入一个特质的时候,必须要混入这个特质依赖的另一个特质
语法:_:特质=>

trait Age1{
  
}
trait Young1{
  _:Age1=>
}
class Person10 extends Young1 with Age1 {
  
}

2.5 特质和抽象类的区别

优先使用特质,一个类扩展多个特质是很方便的,但是只能扩展一个抽象类
如果需要构造函数参数,使用抽象类。因为抽象类可以定义带参数的构造函数,而特质不行

扩展

1.obj.isInstanceOf[T] //判断obj是不是T类型
2.obj.asInstanceOf[T] //将obj强转为T类型
3.classOf获取类模板 //相当于Java中的反射

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

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

相关文章

分享7款优质免费的Figma“中文插件”

今天我要向你们分享一些 Figma 的“中文插件”,这些插件不仅功能强大,而且免费使用,非常方便,而且是完全中文的页面使用起来非常便捷,可以大大提高设计师的效率和体验。 1、「平面 3D」 插件 首先是平面 3D 插件。该…

OpenVINO 2022.3之九:Post-training Optimization Tool (POT)

OpenVINO 2022.3之九:Post-training Optimization Tool (POT) Post-training Optimization Tool (POT) 通过在已训练好的模型上应用量化算法,将模型的权重和激活函数从 FP32/FP16 的值域映射到 INT8 的值域中,从而实现模型压缩,以…

驱动开发:内核实现进程汇编与反汇编

在笔者上一篇文章《驱动开发:内核MDL读写进程内存》简单介绍了如何通过MDL映射的方式实现进程读写操作,本章将通过如上案例实现远程进程反汇编功能,此类功能也是ARK工具中最常见的功能之一,通常此类功能的实现分为两部分&#xff…

WXSS 模板样式

WXSS WXSS(WeiXin Style Sheets)是一套样式语言,用来美化 WXML 的组件样式,类似于网页开发中的 CSS WXSS 和 CSS 的关系 WXSS 具有 CSS 大部分特性,同时,WXSS 还对 CSS 进行了扩充以及修改,以…

AJ-Report是一个完全开源,拖拽编辑的可视化设计工具

简介 AJ-Report是全开源的一个BI平台,酷炫大屏展示,能随时随地掌控业务动态,让每个决策都有数据支撑。     多数据源支持,内置mysql、elasticsearch、kudu驱动,支持自定义数据集省去数据接口开发,目前已支…

分布式应用之监控平台zabbix

1.监控系统的相关知识 1.1 监控系统运用的原因 当我们需要实时关注与其相关的各项指标是否正常,往往存在着很多的服务器、网络设备等硬件资源,如果我们想要能够更加方便的、集中的监控他们,zabix可以实现集中监控管理的应用程序 监控的初衷…

历届蓝桥杯青少年编程比赛 计算思维题真题解析【已更新3套 持续更新中】

一、计算思维组考试范围 计算思维组面向小学生(7-12 岁,约 1-6 年级),通过设计多个角度的考核题目、层次科学的试卷组合、线上限时的考试形式,更加精确地考查学生的计算能力、反应能力、思维与分析能力,使…

【产品成长】产品专业化提升路径

产品专业化 产品专业化就是上山寻路。梳理一套作为产品经理的工作方法。 以图为例,做一个归纳。 第一:梳理自己的设计方法。就是拿到一个需求点之后,如何进行需求分析,如何还原业务情况,最终进行产品设计&#xff0c…

基于QEMU的RISC-V架构linux系统开发(三)——基于buildroot的最小根文件系统配置与编译

1.buildroot官网下载最新版本的buildroot。 https://buildroot.org/download.html 图1 下载最新版本的buildroot压缩包 2.拷贝buildroot软件包到工作目录,并解压buildroot。 图2 解压buildroot软件包 3.新建编译脚本build_risc-v.sh,使用buildroot自带的…

深度学习笔记之递归网络(五)递归神经网络的反向传播过程

机器学习笔记之递归网络——递归神经网络的反向传播过程 引言回顾:递归神经网络的前馈计算过程场景构建前馈计算描述 反向传播过程各参数的梯度计算各时刻损失函数梯度计算损失函数对各时刻神经元输出的梯度计算 Softmax \text{Softmax} Softmax回归的梯度计算关于 …

JAVA将xml数据转为实体类

使用 JAXB(Java Architecture for XML Binding) 实现XML与Bean的相互转换 介绍 JAXB是一个业界的标准,是一项可以根据XML Schema产生Java类的技术。该过程中,JAXB也提供了将XML实例文档反向生成Java对象树的方法,并能将Java对象…

2023年7大人工智能技术趋势你有了解过嘛

人工智能 (AI) 已经接管世界,并且将在2023年继续向前发展。在2023年,它将完全实现自动化供应链、虚拟助手等多个产品与形态。 如今,世界正在经历一波人工智能驱动的全球经济转型浪潮。 当前之态势,人工智能 (AI) 技术几乎在每个领…

如何用Python进行屏幕录制?

文章目录 引言gpt3.5给出的代码更换截图函数——ImageGrab.grab禁用imshow解决递归现象摄像头录制代码后期需求 引言 关于屏幕录制这个功能需求,之前用过基于ffmpeg的Capture录屏软件,但是fps拉高以后会变得很卡,声音也同样出现卡顿。也自己…

cpu 内核 逻辑处理器的关系

6核CPU,12个逻辑处理器 一颗内核在一个时间片内只能执行一个内核线程;当物理CPU使用了超线程技术后,在CPU的一颗内核中,利用就是利用其中空闲的执行单元,模拟出另外一个核心(并不是真正的物理运算核心&…

公司招人,面了一个5年经验不会自动化的测试人,他凭什么要18K?

在深圳这家金融公司也待了几年,被别人面试过也面试过别人,大大小小的事情也见识不少,今天又是团面的一天, 一百多个人都聚集在一起,因为公司最近在谈项目出来面试就2个人,无奈又被叫到面试房间。 整个过程…

【算法训练(day5)】前缀和与差分

目录 一.一维前缀 二.二维前缀和 三.一维差分 四.二维差分 一.一维前缀 1.前缀的作用 前缀用于在求一部分区间的和,比方说有一组数据a1,a2,a3,a4,我们想知道从第一个元素一直相加到最后一个元素的和或者是从第二个元素加到第三个元素,这种情况下就能…

docker部署elasticsearch:8.6.2, kibana,logstash 版本以及kibana的使用

文章目录 1、参考2、安装elasticsearch:8.6.22.1 创建网络2.2 创建无密码访问的elasticsearch服务2.3 访问验证2.4 建一个索引试试,此索引名为my-book,有六个字段2.5 用GET命令获取索引信息试试,如下,符合预期2.6 再试试批量导入一…

redis集群的架构、问题,附脑洞

本文首发自「慕课网」(www.imooc.com),想了解更多IT干货内容,程序员圈内热闻,欢迎关注"慕课网"或慕课网公众号! 作者:一凡 | 慕课网讲师 Redis 是一种开源(BSD 许可&…

魔术表演-第14届蓝桥杯省赛Scratch中级组真题第1题

[导读]:超平老师的《Scratch蓝桥杯真题解析100讲》已经全部完成,后续会不定期解读蓝桥杯真题,这是Scratch蓝桥杯真题解析第136讲。 魔术表演,本题是2023年5月7日举行的第14届蓝桥杯省赛Scratch图形化编程中级组真题第1题&#xf…

【arxiv】论文找 idea : 关于 OVD 的论文扫读(四)

文章目录 一、DetCLIPv2: Scalable Open-Vocabulary Object Detection Pre-training via Word-Region Alignment二、Prompt-Guided Transformers for End-to-End Open-Vocabulary Object Detection三、Bridging the Gap between Object and Image-level Representations for Op…