Scala中特质介绍

Scala—— 10.trait特质(接口)(未完待续) 面向对象来看,接口并不属于面向对象的范畴,Scala是纯面向对象的语言,在Scala中,没有接口。Scala语言中,采用特质trait(特征)来代替接口的概念,也就是说,多个类具有相同的特质(特征)时,就可以将这个特质(特征)独立出来,采用关键字trait声明。理解trait等价于(interface+abstract class)。 1.trait的声明 trait 特质名 {       trait 体      } 特质名 一般首字母大写 Cloneable,Serializable。 在Scala中,Java中的接口可以当做特质使用。 object boke_demo01 { de 立即下载

 

为什么没有多重继承

 

Scala和Java一样不允许从多个超类继承。一开始,这听上去像是个很不幸的局限。为什么类就不能从多个类进行扩展呢?某些编程语言,特别是C++,允许多重继承--但是代价也是出人意料的高。

如果把毫不相干的类组装在一起,多重继承没有什么问题,但是如果这些类具有某些共同字段或方法,麻烦就来了。例如:

class Student {
    private Integer id;
}

class Employee {
    private Integer id;
}


// 假如我们有一个子类继承上面两个父类
class child extend Student,Employee {
    // 此时该类中就继承了两个id, 那么我们在调用该类中id字段的时候根本就不知道是哪一个。
}

 

在Java中应对这种问题采用了非常强的限制策略。类只能扩展自一个超类,它可以实现任意数量的接口,但是接口只能包含抽象方法,不能包含字段。

 

Scala提供特质而非接口。特质可以同时拥有抽象方法和具体方法,而类可以实现多个特质。这个设计解决了Java接口的问题。

 

----

 

当做接口使用的特质

 

下面我们先用Scala定义一个特质

trait Logger{
  // scala中不需要将方法声明为abstract , 特质中未被实现的方法默认就是抽象的
  def log(msg:String) // 抽象方法
}

// 使用 extends 继承特质 ,和Java一样,Scala只能继承一个超类,但可以有任意数量的特质
// 如果需要的特质不止一个我们可以使用 with 关键字来增加额外的特质
class ConsoleLogger extends Logger with Cloneable with Serializable{
  // 重写特质中抽象方法也不需要 override
  def log(msg: String): Unit = println(msg)
}

 

 

带有具体实现的特质

 

在Scala中,特质中的方法并不一定就是抽象的。

trait ConsoleLogger {
  def log(msg: String): Unit = println(msg)
}

// 继承 特质ConsoleLogger 可以直接使用特质中定义的具体方法
class saveAccount extends ConsoleLogger{
  def withdraw() ={
    log("do something")
  }
}

上面例子中 saveAccount继承了特质ConsoleLogger,并且直接调用特质中的log方法,如果使用Java接口是无法实现的。

 

 

带有特质的对象

 

在构造单个对象的时候,你可以为它添加特质。

class SaveAccount extends Account with Logged {

  def withdraw(amount:Double) ={
    log("do something")
  }
}

// 在类中定义一个特质,有一个什么都不做的具体方法,
trait Logged {
  def log(msg:String) = {

  }
}

上面例子中有可能日志不会被记录,但是我们可以在构造具体对象的会后混入一个日志的实现。这样就可以进行日志记录了。

val account = new SaveAccount with Logged
account.log("do something else")

 

 

在特质中重写抽像方法

 

下面这段代码在编译时就会报错,因为我们在Logger中定义的log方法是抽象方法没有具体实现。

trait TimeStampLogger extends Logger {
  // 重写抽象方法
  override def log(msg:String) = {
    // 编译时报错
    /**
     * 报错信息
     * Error:(43, 11) method log in trait Logger is accessed from super.
     * It may not be abstract unless it is overridden by a member declared `abstract' and `override'
     * super.log(new Date() + msg)
     */
    super.log(new Date() + msg)
  }

}

Scala会认为在TimeStampLogger中log()仍然是抽象的,所以需要添加 override 和 abstract 关键字。这样就不会报错。

trait TimeStampLogger extends Logger {
  // 重写抽象方法
  override abstract def log(msg:String) = {
    super.log(new Date() + msg)
  }
}

 

 

特质中的抽象字段、具体字段

 

特质中的字段可以是具体的也可以是抽象的,如果在定义的时候给了初始值那么就是具体的。

trait ShortLogger extends Logged {
  val maxLength = 15 // 具体字段
}

混入该特质的类自动获得一个maxLength字段。通常,对于特质中的每一个具体字段,使用该特质的类都会获得一个字段与之对应。这些字段不是被继承的,它们只是简单地被加到子类当中。

那么为什么会被直接加到子类当中呢。在JVM中,一个类只能扩展一个超类,因此来自特质的字段不能以相同的方式继承,由于这个限制,maxLength字段被直接加到子类中。

 

特质中未被初始化的字段,在子类中必须被重写。

class SaveAccount extends Account with Logged with ShortLogger {

  // 不需要加 override 关键字
  val maxLength: Int = 20
}

 

 

特质构造顺序

 

特质构造器以如下顺序执行

1、首先调用超类的构造器

2、特质构造器在超类构造器调用之后、类构造器调用之前执行

3、特质从左到右被构造

4、每个特质当中,父特质先被构造

5、如果多个特质共有一个父特质,而那个父特质已经被构造,则不会再次被构造

6、所有特质构造完成,子类被构造

 

 

 

长按识别图中二维码

关注获取更多资讯

orangepi 5 plus ubuntu24.04上安装redroid OrangePi 5 Plus运行reDroid云手机方案总结 在RK3588+Ubuntu 24.04上部署reDroid(Android容器化方案)的关键步骤: 内核要求:确保启用binderfs(无需ashmem,新版reDroid使用memfd替代); 安装流程: 安装Docker并配置代理加速镜像拉取; 拉取reDroid镜像(推荐Android 12/13 ARM64版本); 通过挂载binderfs启动容器,指定分辨率与DPI参数; 多实例管理: 脚本化创建多个容器(如8个实例),分配独立端口 阅读详情

相关推荐

ADS中使用Momentum进行电源完整性分析示例

这个应用可以帮助工程师用更快的时间使用ADS Momentum完成PDN分析。该应用描述了利用ADS Momentum RF模拟器进行PDN分析的方法,大大缩短了计算时间。 该分析主要应用与高速数字设计。 在此应用中使用了以下ADS特性: ADS设计流程集成(ADFI)。 电磁协同仿真。 Momentum仿真。 仿真流程如下: 在Allegro中创建ADFI文件 要将Alleg...

zb6075_lb的专栏 7007

Scala之特质

目录 一、特质总述 二、特质语法 三、基本语法 四、特质叠加 五、特质自身类型 六、特质与抽象类 一、特质总述 Scala语言中,采用特质trait(特征)来代替接口的概念,也就是说,多个类具有相同的特质(特征)时,就可以将这个特质(特征)独立出来,采用关键字trait声明。 Scala中的trait中即可以有抽象属性和方法,也可以有具体的属性和方法,一个类可以混入(mixin)多个特质。这种感觉类似于Java中的抽象类。 Scala引入tr...

lslslslslss的博客 1381

MicroPython跨平台移植实战:从源码解析到STM32+FreeRTOS部署

本文详细解析了MicroPython的跨平台移植实战,重点介绍了如何将其从源码开始,成功部署到STM32微控制器并运行于FreeRTOS实时操作系统。内容涵盖源码结构解析、编译环境搭建、内存管理协调、FreeRTOS任务集成、数学库(math)启用与优化,以及自定义模块开发等核心步骤,为开发者提供了一套完整的、可操作的嵌入式Python移植方案。

vodka的博客 1014

Scala特质

文章目录特质入门1.概述2.特点3.语法4.类继承多个特质 特质入门 1.概述 有些时候,我们会遇到一些特定的需求,即:在不影响当前继承体系的情况下,对某些类(或者某些对象)的功能进行加强,例如:有猴子类和大象类,它们都有姓名、年龄以及吃的功能,但是部分的猴子经过马戏团的训练后,学会了骑独轮车,那骑独轮车就不能定义到父类(动物类)或者猴子类中,而是定义到特质中,而Scala中的特质,要用关键字srait修饰 2.特点 特质可以提高代码的复用性 特质可以提高代码的扩展性和可维护性 类特质之间是继承关系,类跟

大数据跟我学i 692

从论文到生产:iSLIP优先级匹配算法在SDN交换机中的20年演进史

本文回顾了iSLIP优先级匹配算法在SDN交换机中的20年演进历程,从斯坦福大学的原始论文到现代芯片实现。通过独特的指针滑动和迭代循环机制,iSLIP算法显著提升了交换机的吞吐量和公平性,解决了传统FIFO调度的队头阻塞问题。文章详细探讨了算法在硬件实现中的工程挑战、开源实践及未来AI时代的智能调度方向。

weixin_29230649的博客 331

11. 使用 HTTP PUT, PATCH 以及 MERGE 请求消费 SAP ABAP OData 服务修改操作的实现及其区别

使用 SAP ABAP SEGW 事物码实现 OData 服务的修改操作时,对于消费端通过 PATCH/MERGE 和 PUT 这三种不同类型的 HTTP 请求触发的场景,我们应该在 UPDATE_ENTITY 方法里用 IF 分支分别进行处理,原因就在于 GET_ENTITY 方法是否在修改处理逻辑的过程中被触发。......

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 2457

云计算题库

1.下列关于云存储的描述不正确的是 ( ) A. 可以将网络中大量各种不同类型的存储设备通过应用软件集合起来协同工作。 B. 需要通过集群应用、网格技术或分布式文件系统等技术实现 C. 云存储通过服务的形式提供给用户使用 D. “云存储对于使用者来讲是透明的”,也就是说使用者清楚存储设备的品牌,型号的具体细节 答案: D 2.下面哪个操作肯定是宽依赖 A. flatMap B. sample C. map D. reduceByKey 答案:D 3.mapreduce的样例放在哪个目录中

Alex_wanwan的博客 6132

华为od统一考试B卷【宜居星球改造计划】Java&Go 实现

XXX年,人类通过对火星的大气进行宜居改造分析,使得火星已在理论上具备人类宜居的条件,由于技术原因,无法一次性将火星大气全部改造,只能通过局部处理形式,假设将火星待改造的区域为row * column的网格每个网格有3个值,宜居区、可改造区、死亡区,使用YES、NO、NA代替,YES表示该网格已经完成大气改造,NO表示该网格未进行改造,后期可进行改造,NA表示死亡区,不作为判断是否改造完成的宜居,无法穿过 初始化下,该区域可能存在多个宜居区,并且每个宜居区能同时在每个太阳日单位向上下左右四个方向的相邻格子进

MISAYAONE的博客 1万+

Scala学习笔记10: 特质

在Scala中, 特质(Tratis) 是一种非常强大的特性, 可以为类提供额外的功能, 类似于 Java中的接口 ; 特质可以包含抽象方法、具体方法、字段等, 并且可以被类混入以增强类的功能 .

Taerge0110的博客 1746

深度学习实战:基于YOLOv5/v8/v10的快递暴力分拣检测系统(完整版)

在电商物流高速发展的今天,快递包裹日均处理量已突破亿件级别。然而,快递分拣过程中的暴力抛扔行为不仅造成包裹损坏,更带来巨大的经济损失。据统计,每年因暴力分拣导致的快递破损投诉占总投诉量的30%以上。传统的人工监控方式存在疲劳、疏漏等问题,因此开发一套智能化的快递暴力分拣检测系统具有重要的现实意义。

YOLO 274

十年芯片资深IC设计工程师面经系列(四)SDC约束

set_driving_cell:当我们的设计是模块级(Block level)的design时,我们的设计前面一般还有其他的设计,那么前面模块的输出便是我们模块的输入,5.1set_false_path:可以单独的时钟或者路径进行约束。set drive :当我们的设计是芯片级(Chip level)的顶层设计时,芯片外围电路要驱动的是负载较大的IO单元,故需要的驱动能力较强,:set_load 是指output端口的负载,设置的值会影响输出到端口的net上的电容,从而影响相应的路径延时。

weixin_47349046的博客 1773

Scala的概述及特点

目录 一、大数据为什么学习Scala 二、Scala起源 三、Scala特点 1.面向对象 2.函数式编程 3.静态类型 4.扩展性 5.动态性 四、什么是函数式编程 函数式编程的特点: 函数式编程优势: 五、什么是静态语言和动态语言 六、什么是强类型和弱类型语言 一、大数据为什么学习Scala 1.优雅:这是框架设计师第一个要考虑的问题,框架的用户是应用开发程序员,API是否优雅直接影响用户体验。 2.速度快:Scala语言表达能力强,一行代码抵得...

CyAurora的博客 7896

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Scala的特质(Trait)介绍

Scala的特质(Trait)基本概念特质声明基本语法特质的使用基本语法说明案例实操特质叠加基本概念案例实操特质叠加执行顺序案例说明特质自身类型说明案例实操特质和抽象类的区别 基本概念 Scala 语言中,采用特质 trait(特征)来代替接口的概念,也就是说,多个类具有相同 的特质(特征)时,就可以将这个特质(特征)独立出来,采用关键字 trait 声明。 Scala中的 trait中即可以有抽象属性和方法,也可以有具体的属性和方法,一个类可 以混入(mixin)多个特质。这种感觉类似于 Java中的抽象

一入大数据深似海?别怕!“数据极客圈”就是你的救生圈,走对圈子跟对人,趣析数据、畅聊趋势,快进圈子! 1812

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Scala2.11.7学习笔记(六)Scala特质介绍

鲁春利的工作笔记,好记性不如烂笔头特质 Scala的trait 和Java 的Interface相比,可以有方法的实现。Scala的Trait支持类和Singleton对象和多个Trait混合(使用来自这些Trait中的 方法,而不时不违反单一继承的原则)。Scala为Singleton对象的main定义了一个App trait类型,因此上面的例子可以简化为:H...

weixin_34109408的博客 119

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

scala泛型的特质:Trait

在定义泛型特质的子类或者子单例对象时, 明确具体的数据类型.2)trait 类名[S,T...]泛型特质,x是泛型名称,可以更改。1)trait 类名[T]

2401_83374563的博客 745

05 抽象类、扩展类和特质

前面我们了解了类和对象,本节我们将了解scala当中的抽象类、扩展类以及特质【相当于java中的接口】。 1 系统、软件以及前提约束 win10 64位 已了解scala中的类与对象,并进行code https://www.jianshu.com/p/92f555f859c2 idea2018.1 2 操作 1 定义抽象类AbstractUserService.scala ...

张力的程序园 154

Scala中的继承和特质

1.继承 1.1 扩展类 在Scala中,让子类继承父类,与Java一样,也是使用extends关键字 class Employee extends Person{ var salary = 0.0 } 继承代表子类可以继承父类的field和method;然后子类可以在自己内部放入父类所没有,子类特有的field和method;使用继承可以有效复用代码。 子类可以覆盖父类的field和meth...

zhaoguowei的博客 701

Scala入门学习(四)——trait特质

的方法。

qq_67520019的博客 754

Scala基础语法7_特质

特质(interface): 快捷键:control+I Control + O control + I 特质中有方法未实现,快捷键可以在继承该特质的对象或class(类)中实现该方法 control + O 在对象中或者类中实现特质的方法重写 package day03 /** * 特质(interface) * 在Scala中特质中可以定义有实现的方法,也可以定义...

weixin_42596333的博客 278

scala的特质 | 定义具体的方法

特质 | 定义具体的方法 和类一样,trait中还可以定义具体的方法 示例 示例说明 定义一个Logger特质,添加log实现方法 定义一个UserService类,实现Logger特质 添加add方法,打印"添加用户" 添加main方法 创建UserService对象实例 调用add方法 参考代码: trait LoggerDetail { // 在trait中定义具体方法 def lo...

汉子一枚 845

scala特质

1.scala中不支持多继承类,但是可以多继承特质 2.当做接口使用的特质 //特质可以同时拥有抽象方法和具体方法 trait Logger { def log(msg: String) //抽象方法 无需使用abstract关键字 } class ConsoleLogger extends Logger with Serializable with Clon...

weixin_30693683的博客 96

【Scala】特质与特质的线性化

特质Scala里相当于Java接口的是Trait(特征)。实际上它比接口还功能强大。与接口不同的是,它还可以定义属性和方法的实现。Scala中特征被用于服务于单一目的功能模块的模块化中。通过混合这种特征(模块)群来实现各种应用程序的功能要求,Scala也是按照这个构想来设计的。特质的构造顺序特质也可以有构造器,由字段的初始化和其他特质体中的语句构成。这些语句在任何混入该特质的对象在构造时都会被执行。

Jason Ding的专栏 2431

第八章 Scala基础——特质

一、什么是特质 因为Scala没有多重继承,为了提高代码复用率,故而创造了新的编程概念——特质。 特质是用关键字“trait”为开头来定义的,它与单例对象很像,两者都不能有入参。但是,单例对象天生就是具体的,特质天生就是抽象的,不过不需要用“abstract”来说明。所以,特质可以包含抽象成员,而单例对象却不行。另外,两者都不能用new来实例化,因为特质是抽象的,而单例对象已经是具体的对象。类...

qq_34291505的博客 8077

scala学习之特质(trait)

特质,很像java中的接口,但是又有些不同,比如实现方法,当然java8也可以在接口中实现一个方法了,但是只能定义一个default方法。 当做接口使用 //特质 trait Logger { def log(msg:String) } trait ConsoleLogger extends Logger{ //extends not implements def log(m

乄浅醉的专栏 580

scala_特质(Trait)

特质(Trait) 定义 特质是Scala中特有一种形式; 特质(Trait)用于类于类之间共享方法和属性,Scala特质相当于是Java8中的接口 在Scala特质中即可以定义属性,也可以定义抽象方法而且还可以定义已经实现的方法 ps:Scala中一切皆继承,Scala会将所有的数据类型都看做类,所以只有一个关键字 extends 没有 implements 实现 语法 1.在没有父类的前...

weixin_45536884的博客 254
上一篇: Scala中继承介绍
下一篇: Scala高阶函数介绍
geek-wmy
博客等级 码龄9年 322粉丝 126原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值