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

news/2024/11/25 21:58:50/

文章目录

  • 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:Intdef sayHi():Unit//具体的属性和方法val age1:Int=10def sayHi1():Unit=println("hi age")
}trait young09{}class Father01{}//实现特质
//有父类的情况
class Children01 extends Father01 with Age09 with young09 {override val age: Int = 21override def sayHi(): Unit = "hello"
}//没有父类的情况
class Children02 extends Age09 with young09 {override val age: Int = 18override 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 Child03println(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 subprintln(sub0.info())}
}
trait TraitC{val age:Intdef info():String={"age"}
}
trait TraitB extends TraitC {override val age:Int=12override def info():String={"young"+super.info()}
}
trait TraitA extends TraitC {override val age:Int=62override 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.ppmy.cn/news/75052.html

相关文章

MarkDown语法1

MarkDown语法1 段落样式 RUNOOB.COM GOOLE.COM 字体 斜体文本 斜体文本 粗体文本 粗斜体文本 粗斜体文本 高亮文本 高亮加粗文本 分割线 删除线 RUNOOB.COM GOOGLE.COM BAIDU.COM 下划线 带下划线文本 脚注 MarkDown列表 MarkDown支持有序列表和无序列表。…

电脑版pdf阅读器有哪些?编辑途径分析

PDF 阅读器电脑版是一种十分流行的电子文档阅读工具,它可以让用户在电脑上轻松地阅读各种文档,包括 PDF 文件。在数字化信息时代,PDF 阅读器电脑版已经成为了许多人电脑上必备的工具之一。本文将探讨 PDF 阅读器电脑版的优缺点,以…

体验css:repeat和grid

文章目录 一、repeat1. 语法2. auto-fill和auto-fit3. 专属尺寸① fr② auto③ max-content④ min-content 二、grid1. 设置grid布局2. 设置列宽行高3. 设置间距4. 设置分区5. 设置布局排列顺序6. 设置单元格内容对齐方式7. 设置整个网格对齐方式8. 设置隐式网格大小9. 设置网格…

波奇学Linux:时间指令,查找指令,压缩指令,热键

日志:时间,日志等级,日志具体信息,其他信息用来记录程序信息 时间指令 data指令显示时间 修改时间显示格式 时间戳: date %s 时间戳:统一的时间格式,因为有时差原因,时间相对于各…

C++爱好者的自我修养(12.1):数据类型——整型

文章目录 数据类型——整型1.1 短整型1.1.1 有符号1.1.2 无符号 1.2 整型1.2.1 有符号1.2.2 无符号 1.3 长整型1.3.1 有符号1.3.2 无符号 1.4 超长整型1.4.1 有符号1.4.2 无符号 数据类型——整型 1.1 短整型 1.1.1 有符号 类型标识符:short 占节字数&#xff1a…

玄子Share - mybatis-3.5.13 学习笔记

玄子Share - mybatis-3.5.13 学习笔记 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-edDRdx4N-1684580838688)(./assets/68747470733a2f2f6d7962617469732e6f72672f696d616765732f6d7962617469732d6c6f676f2e706e67.png)] mybatis 官网 官网 htt…

zabbix企业监控实战-1-zabbix部署

官网:https://www.zabbix.com 参考官网:https://www.zabbix.com/download?zabbix6.0&os_distributionrocky_linux&os_version8&componentsserver_frontend_agent&dbmysql&wsapache 1、环境准备 1> 修改主机名 [rootzabbix ~]# h…

mkfs.vfat以及mkfs.ext4命令详解

文章目录 前言:mkfs.vfat/mkfs.fatmkfs.ext4 前言: 做磁盘格式化(文件系统创建) 的时候发现网上对于mkfs.vfat和mkfs.ext4的命令解释都不多,这边就特地整理一下,虽然用man就可以查看,但是懒人嘛,还是喜欢看…