Scala之trait

C# 异步编程详解(Task,async/await) 同步和异步主要用于修饰方法。当一个方法被调用时,调用者需要等待该方法执行完毕并返回才能继续执行,我们称这个方法是同步方法;当一个方法被调用时立即返回,并获取一个线程执行该方法内部的业务,调用者不用等待该方法执行完毕,我们称这个方法为异步方法。异步的好处在于非阻塞(调用线程不会暂停执行去等待子线程完成),因此我们把一些不需要立即使用结果、较耗时的任务设为异步执行,可以提高程序的运行效率。 阅读详情

1. 将trait作为接口使用
Scala中的Triat是一种特殊的概念,首先我们可以将Trait作为接口来使用,此时的Triat就与Java中的接口非常类似。
在triat中可以定义抽象方法,就与抽象类中的抽象方法一样,只要不给出方法的具体实现即可。
类可以使用extends关键字继承trait,注意,这里不是implement,而是extends,在scala中没有implement的概念,无论继承类还是trait,统一都是extends。
类继承trait后,必须实现其中的抽象方法,实现时不需要使用override关键字。
scala不支持对类进行多继承,但是支持多重继承trait,使用with关键字即可。

2.在trait中定义具体方法
Scala中的Triat可以不是只定义抽象方法,还可以定义具体方法,此时trait更像是包含了通用工具方法的东西,有一个专有的名词来形容这种情况,就是说trait的功能混入了类。
举例来说,trait中可以包含一些很多类都通用的功能方法,比如打印日志等等,spark中就使用了trait来定义了通用的日志打印方法。

3.在trait中定义具体字段
Scala中的Triat可以定义具体field,此时继承trait的类就自动获得了trait中定义的field。
但是这种获取field的方式与继承class是不同的:如果是继承class获取的field,实际是定义在父类中的;而继承trait获取的field,就直接被添加到了类中。

trait Person {
  val eyeNum: Int = 2
}
class Student(val name: String) extends Person {
  def sayHello = println("Hi, I'm " + name + ", I have " + eyeNum + " eyes.")
}

4.在Trait中定义抽象字段
Scala中的Triat可以定义抽象field,而trait中的具体方法则可以基于抽象field来编写,但是继承trait的类,则必须覆盖抽象field,提供具体的值

5.为实例混入trait
有时我们可以在创建类的对象时,指定该对象混入某个trait,这样,就只有这个对象混入该trait的方法,而类的其他对象则没有

trait Trait03 {
  def sayHello(): Unit = {
    println("hello world")
  }
}
class Childer(var name: String, var age: Int) {
}
object Childer {
  def main(args: Array[String]): Unit = {
    // 有时我们可以在创建类的对象时,指定该对象混入某个trait,
    // 这样,就只有这个对象混入该trait的方法,而类的其他对象则没有
    val childer1 = new Childer("旺财", 5) with Trait03
    childer1.sayHello()
    val childer2 = new Childer("baby", 1)
  }
}

6.trait调用链
Scala中支持让类继承多个trait后,依次调用多个trait中的同一个方法,只要让多个trait的同一个方法中,在最后都执行super.方法即可。
类中调用多个trait中都有的这个方法时,首先会从最右边的trait的方法开始执行,然后依次往左执行,形成一个调用链条。
这种特性非常强大,其实就相当于设计模式中的责任链模式的一种具体实现依赖。

7.在trait中覆盖抽象方法
在trait中,是可以覆盖父trait的抽象方法的。
但是覆盖时,如果使用了super.方法的代码,则无法通过编译。因为super.方法就会去掉用父trait的抽象方法,此时子trait的该方法还是会被认为是抽象的。
此时如果要通过编译,就得给子trait的方法加上abstract override修饰。

trait Demo04 {
  def say():Unit
}
trait Demo04_1 extends Demo04{
 override def say(): Unit ={
    println("hello")
    //但是覆盖时,如果使用了super.方法的代码,则无法通过编译。因为super.方法就会去掉用父trait的抽象方法,
    // 此时子trait的该方法还是会被认为是抽象的
    //下面代码不能编译通过,如果需要编译通过,必须在方法上加上 abstract 关键字
    //super.say()
  }
}
object Demo044{
  def main(args: Array[String]) {
    val d = new Demo04 {
      override def say(): Unit = {
        println("hi")
      }
    }
    d.say()
   val dd = new Demo04_1 {
       override def say():Unit=super.say()
    }
    dd.say()
  }
}

8.混合使用trait的具体方法和抽象方法
在trait中,可以混合使用具体方法和抽象方法
可以让具体方法依赖于抽象方法,而抽象方法则放到继承trait的类中去实现
这种trait其实就是设计模式中的模板设计模式的体现

trait Trait06 {
  def getName: String

  def valid() = {
    //可以在具体方法中调用抽象方法
    getName == "jim"
  }
}

class Trait06_01 extends Trait06 {
  override def getName: String = "jim"
}

object Trait06_01 {
  def main(args: Array[String]): Unit = {
    val t = new Trait06_01
    println(t.valid())
  }
}

9. trait的构造机制
在Scala中,trait也是有构造代码的,也就是trait中的,不包含在任何方法中的代码
而继承了trait的类的构造机制如下:1、父类的构造函数执行;2、trait的构造代码执行,多个trait从左到右依次执行;3、构造trait时会先构造父trait,如果多个trait继承同一个父trait,则父trait只会构造一次;4、所有trait构造完毕之后,子类的构造函数执行
10.trait继承class
在Scala中,trait也可以继承自class,此时这个class就会成为所有继承该trait的类的父类

60、新型共轴直升机建模与事件触发积分强化学习研究 本文研究了新型共轴直升机的动力学建模与控制方法,基于牛顿-欧拉方程建立了6自由度非线性模型,并设计了四通道闭环控制器实现稳定飞行。同时,提出一种事件触发积分强化学习方法,用于解决非零和博弈中的最优跟踪控制问题,在减少通信开销的同时保证系统性能。通过仿真验证了控制器的轨迹跟踪能力,并证明了算法下跟踪误差与神经网络权重估计误差的一致最终有界性。两种方法协同可提升飞行器的自主性与鲁棒性,未来可拓展至多智能体协作、智能交通等复杂系统应用。 阅读详情

相关推荐

嵌入式接口通识知识之PCIe接口

PCIe x1接口是最常见的一种,插槽的长度是最短的,仅有25mm。PCIe x4接口有四个数据通道,提供比x1接口更高的带宽,插槽的长度为39mm,分为前后两组,一组22根针脚用于供电,剩下的42根针脚是数据针脚。插槽全长89mm,有164根针脚,分为前后两组,较短的插槽有22根针脚,主要用于供电,较长的插槽142根,主要用于数据传输,具有16通道所带来的高带宽。PCIe x8接口有八个数据通道,插槽全长56mm,有98跟针脚,分为前后两组,较短的22根针脚用于供电,剩下的76根针脚是数据针脚。

2301_76587520的博客 1305

Scala基础语法之Trait详解

有些时候, 我们会遇到一些特定的需求, 即: 在不影响当前继承体系的情况下, 对某些类(或者某些对象)的功能进行加强, 例如: 有猴子类和大象类, 它们都有姓名, 年龄, 以及吃的功能, 但是部分的猴子经过马戏团的训练后, 学会了骑独轮车. 那骑独轮车这个功能就不能定义到父类(动物类)或者猴子类中, 而是应该定义到特质中. 而Scala中的特质, 要用关键字trait修饰.概述设计模式(Design Pattern)是前辈们对代码开发经验的总结,是解决特定问题的一系列套路。

黑马程序员官方博客 2302

基于反相器的超声波发生和气泡检测电路

本文主要介绍了关于超声波的两种电路——基于反相器的振荡电路和基于逻辑们的气泡检测电路

xehagy的博客 1954

Scala-11:面向对象04-特质(Trait)

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

weixin_46429290的博客 416

谷歌倾斜摄影数据获取以及转换3DTiles介绍

解析谷歌倾斜模型数据,再一键设置无人值守的情况下,快速将谷歌倾斜摄影模型数据转成3DTiles数据,并在Cesium上进行流畅漫游缩放显示,效果优于官方3DTiiles格式数据

cyber_room的博客 5335

Vue 前端导出页面A4大小pdf,Vue前端导出pdf自动切割换页不切割内容 Vue导出页面pdf自动分页和添加页码 导出的pdf提高清晰度

【代码】Vue 前端导出页面A4大小pdf,Vue前端导出pdf自动切割换页不切割内容 Vue导出页面pdf自动分页和添加页码 导出的pdf提高清晰度。

weixin_41346436的博客 1797

Scala的特质(Trait)介绍

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

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

QT C++ AI棉花智能变量灌溉工上位机(信创完整版)

北斗履带灌溉机器人/田间分区电磁阀基站 → 多层土壤温湿度/盐分EC传感器实时采集墒情 → 双目AI视觉扫描棉田长势、病苗分布 → AI融合**生育期+土壤墒情+盐分+棉株长势**计算变量灌溉定额、水肥配比、灌溉时长 → 分区电磁阀/变频水泵变量供水,病弱苗地块减量、干旱地块增量;墒情、盐分、长势多因子闭环修正灌水量;多层土壤含水率(0–10/20–40/40–80cm)、土壤EC盐分、土壤温度、空气温湿度、蒸发量、北斗地块坐标、管道水压、水肥罐液位、分区流量计、水泵电机负载、滴灌带压力反馈。

寒寒豆豆软件公司的博客 184

Scala 特质(Trait)

特质 特质(Traits): 用于在类(Class)之间共享程序接口(Interface)和字段(Fields),这类似于 Java 8 中的接口,类和对象(Object)可以扩展特质,但特质不能被实例化,因此特质没有参数。 Scala 中的 trait 中可以有抽象的属性和方法、具体的属性和方法(类似于 Java 中抽象类的概念)。Scala 引入 trait 的概念,能够代替 Java 的接口,也是对的单继承机制的一种补充。。trait 用于约束程序设计的规范。一个类可以混入(mixin)多个特质。

weixin_47243236的博客 802

【AHE数据集】中国2019年多源热排放数据集-500m空间分辨率

【AHE数据集】中国2019年多源热排放数据集

WW、forever的博客 411

【yolo】如何在 YOLOv8 中添加负样本以减少误检

在YOLOv8目标检测中,误检(False Positive)是一个常见问题,即模型将非目标区域错误识别为目标。通过引入负样本(Negative Samples),即不包含任何目标框的图像,可以有效减少误检。在YOLOv8中添加负样本的方法是为这些图像提供空的标注文件(.txt),确保每张图像都有对应的标注文件,即使内容为空。可以使用Python脚本自动生成这些空标注文件。使用负样本时需注意数量比例、标注一致性、验证集同步和图像质量。适当加入负样本能显著提升模型鲁棒性,降低误判风险。

songhuangong123的博客 2878

Scala 中的 特质(trait)

文章目录特质(trait)概念语法继承特质继承单个trait 代码示例继承多个特质 代码示例定义具体的方法代码示例trait中定义具体的字段和抽象的字段定义代码示例模板模式代码示例对象混入trait语法代码示例trait调用链代码示例trait的构造机制代码示例trait继承class代码示例 特质(trait) scala中没有Java中的接口(interface),替代的概念是——特质 概念 ...

hongchenshijie的博客 999

【原创】关于西门子S120 的电气图纸设计

我们首先要了解一下模块的基本信息:SINAMICS 功率模块 PM240-2 三相交流380-480V+10/-10% 47-63Hz;至此,我们选择的驱动系统配置的资料都已经查找完毕,接下来就是根据每个部件的功能接口和我们需要实现的功能画出接线连接图,这样关于伺服电机控制,硬件部分设计就完成了。2)FSA - FSC 型功率模块 PM240-2 的屏蔽连接板外形尺寸图,所有数据以毫米(英寸)为单位。1)FSA 型功率模块 PM240-2 的外形尺寸图,所有数据以毫米(英寸)为单位。

Qinmingyue13的博客 2637

Scala 的trait

当类P中混入类S时,S的位置必须在extends之后,特质A或B不可以与类S互换位置,但是A和B的位置可以互换,例如class P extends S with A with B。下面介绍一个类继承了一个特质后,特质中的成员的处理方式。关于多继承问题,Java中的类不支持多继承,接口支持多实现:而在Scala中trait可以支持多继承,也可以在多继承的同时混入多个特质。在JDK1.7中,Java的接口只能定义一些没实现的方法体和一些赋值的变量,而Scala的trait相当于接口和抽象类的合体。

2301_81748087的博客 1683

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Scala的trait

由于`info`方法依赖于`log`方法,而`log`方法在`TimestampedLogger`中被重写以包含时间戳,因此最终输出的日志消息将包含时间戳和应用程序名称。- 当一个类被实例化时,它的父类构造器会首先被调用(如果存在的话),然后是它混入的trait的初始化代码块(按照trait在类定义中出现的顺序),最后是类自身的构造代码块和构造器。- 由于trait可以包含具体方法,并且可以通过线性化来处理多个trait之间的方法冲突,因此Scala中的trait可以被视为一种“可叠加的修饰符”。

2401_82393285的博客 579

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

scala的trait的构造机制

trait的构造机制 如果一个类实现了多个trait,那这些trait是如何构造的呢? 定义 trait也有构造代码,但和类不一样,特质不能有构造器参数 每个特质只有一个无参数的构造器。 一个类继承另一个类、以及多个trait,当创建该类的实例时,它的构造顺序如下: 执行父类的构造器 从左到右依次执行trait的构造器 如果trait有父trait,先构造父trait,如果多个trait有同样的父...

汉子一枚 818

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

scala——trait

trait 可以理解为一个实现了函数体的接口,或者胖接口每当一个trait被创建时 会生成以接口和一个辅助抽象类。所有的函数实现部分都作为静态函数写在辅助抽象类中。主函数中中所有的调用都会直接调用抽象类中的静态函数实现。代码trait solver{  var value=1;  def answer():Int  def  show() = {println(answer())}  def  s

u012461550的专栏 542

Scala trait介绍

Scala trait介绍及实践。

残缺的孤独 1735

scala接口trait

Scala 语言中,采用特质trait(特征)来代替接口的概念,也就是说,多个类具有相同的特征时,就可以将这个特质(特征)独立出来,采用关键字trait声明。理解 trait 就等价与(interface+abstract class)trait 的声明trait 特质名 {trait 体 }trait 命名 一般字母大写。Serializable:就是 scala 的一个特质。在 scala 中,java 中的接口可以当做特质使用Scala 中 trait 的使用。

CarveStone的博客 1149

scala的trait

1.trait与类的相同点:都可以定义成员变量和方法,成员变量和方法可以是抽象的也可以是具体的。trait相当于抽象类和接口,所以trait既可以定义抽象成员也可以定义普通成员。trait的加载顺序:在构造器的调用顺序为先调用父类构造器再调用子类构造器。如果有多个父类,则按照从左到右的顺序调用,最后才会调用本类构造器。而父类的构造器中由于没有变量没有赋值,相当于null,再通过变量(实际为null)调用方法时就会出现空指针异常的问题。**当子类继承特质时,必须要实现所有的抽象的成员。

2401_83374628的博客 351

Scala Trait

trait 是一种支持多重继承的类。类、case类、对象,以及trait都只能扩展不超过一个类,但是可以同时扩展多个trait。不过,与其他类型不同,trait不能实例化。 语法:定义trait trait identifier> [extends identifier>] [{ fields, methods, and classes }] trait看起来与其他类型的类是一样的。不过,类似对

Ran's Hacking Zone 801

scala 的 trait

Scala Trait(特征) 相当于 Java 的接口,实际上它比接口还功能强大。 与接口不同的是,它还可以定义属性和方法的实现。 一般情况下Scala的类只能够继承单一父类,但是如果是 Trait(特征) 的话就可以继承多个,从结果来看就是实现了多重继承。 Trait(特征) 定义的方式与类类似,但它使用的关键字是 trait,如下所示: object TraitDemo { def ...

Java_Road_Far的博客 331

Scala 之 trait 关键字

这里的trait字面意思是特质或者特征,这个词翻译成特征比较合适。它的意义和java,c#中接口很类似。但是trait支持部分实现,也就是说可以在scala的trait中可以实现部分方法。下面我们以一个具体的例子来介绍下trait的使用。 我们的例子中定义了一个抽象类Aminal表示所有的动物,然后定义了两个trait Flyable和Swimable分别表示会飞和会游泳两种特征。 我们先看下A

Andrew的成长之路 1055

Java的接口与Scala的trait特质

今天说一说Java中的接口和Scala中的trait。一直就把特质当做半个接口用,因为确实挺像的,但仔细看,还是有很大区别的。 1.接口不会有构造器,特质可以有构造器,并且在实现类继承特质的时候,先要调用特质的构造器。 trait构造器的调用顺序小结: class B{} trait C extends E{} trait D extends E{} A extends B w

yoghurt 4982

Scala trait特性

1.概念理解 Scala Trait(特征)相当于Java的接口,实际上他比接口还要功能强大。 与接口不同的是,它还可以定义属性和方法的实现。 一般情况下Scala的类可以继承多个Trait,从结果来看就是实现了多重继承。 Trait(特征)定义的方式与类类似,但他使用的关键字trait。 2.举例 trait中带属性带方法实现 注意:继承的多个trait中如果有同名的方法和属性...

dhyaishuai的博客 334

Scala Trait(特征)

Scala Trait(特征) 1、概念 Scala Trait(特征) 相当于 Java 的接口,实际上它比接口还功能强大。 与接口不同的是,它还可以定义属性和方法的实现。 一般情况下Scala的类只能够继承单一父类,但是如果是 Trait(特征) 的话就可以继承多个,从结果来看就是实现了多重继承。 Trait(特征) 定义的方式与类类似,但它使用的关键字是trait,比如: trait Correct{ def isCorrect(a: Any): Boolean def isN.

ITWUYI的博客 190
上一篇: Scala继承
下一篇: java线程——线程池
echo_ale
博客等级 码龄10年 0粉丝 6原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值