特质

特质概述

  • Java中提供了接口,允许一个类实现任意数量的接口

  • 在Scala中没有接口的概念,而是提供了“特质(trait) ”,它不仅实 现了接口的功能,还具备了很多其他的特性

  • Scala的特质,是代码重用的基本单元,可以同时拥有抽象方法和具体方法

  • Scala中,一个类只能继承自一个超类,却可以实现多个特质,从而重用特质中的方法和字段,实现了多重继承

特质的定义

  • 特质的定义和类的定义非常相似,有区别的是,特质定义使用关键字trait

trait CarId {
 var id:Int
 def currentId():Int
}
  • 上面定义了一个特质,里面包含一个抽象字段id和抽象方法currentId。注 意,抽象方法不需要使用abstract关键字,特质中没有方法体的方法,默 认就是抽象方法

把特质混入类中

  • 特质定义好以后,就可以使用extends或with关键字把特质混入类中

class BYDCarId extends CarId {
 override var id: Int = 10000
 override def currentId(): Int = {
   id += 1
   id
}
}

特质可以包含具体实现

  • 上面的实例中,特质只包含了抽象字段和抽象方法,相当于实现了类似Java 接口的功能。实际上,特质也可以包含具体实现,也就是说,特质中的字段 和方法不一定要是抽象的

trait CarId {
 var id:Int
 def currentId():Int
 def greeting(msg:String): Unit ={
   println(msg)
}
}

把多个特质混入类中

  • 上面已经定义了两个特质CarId和CarGreeting。可以把两个特质都混入到类中

trait CarId{
 var id:Int
 def currentId():Int
}
trait CarGreeting{
 def greeting(msg:String): Unit ={
   println(msg)
}
}
class BYDCarId extends CarId with CarGreeting {
 override var id: Int = 10000
 override def currentId(): Int = {
   id += 1
   id
}
}
object MyCar {
 def main(args: Array[String]): Unit = {
   val mycar = new BYDCarId()
   mycar.greeting("welcome my first car.")
   printf("My first CarId is %d.\n" , mycar.currentId())
}
}
// 执行结果
welcome my first car.
My first CarId is 10001.

Scala_特质的更多相关文章

  1. [转载]DBA的特质第二部分:性格

    本文转自http://www.searchdatabase.com.cn/showcontent_84382.htm 支持原创.尊重原创,分享知识! 在本系列文章中,笔者将谈一谈数据库管理员(DBA) ...

  2. [转载]DBA的特质第一部分:技术

    本文转自http://www.searchdatabase.com.cn/showcontent_84379.htm 支持原创.尊重原创,分享知识! 在本系列文章中,笔者将谈一谈数据库管理员(DBA) ...

  3. Scala学习笔记(七):Application特质

    Scala提供了特质scala.Application 在单例对象名后面写上“extends Application”,把想要执行的代码直接放在单例对象的花括号之间 import ChecksumAc ...

  4. Objective-C中属性及其特质@property、attribute

    属性: 属性@property和属性attribute不同,@property在OC里有自己的一套专对实例变量的处理机制.attribute我们可以特指属性所具有或遵循的特质. 使用属性,编译器就会自 ...

  5. scala特质

    package com.ming.test /** * scala 特质,类似与java接口,但是比java接口强大,可以有实现方法,定义字段之类的 */ /** * 定义一个日志的特质 */ tra ...

  6. 解谜谷歌 DevOps:什么特质可以打造世界级可靠系统?

    [编者按]本文是 Gene Kim 总结自对 Randy Shoup 两个小时的采访,主要关注谷歌 DevOps 的提升之道.本文系 OneAPM联合高效运维编译整理. Randy Shoup 曾协助 ...

  7. Scala学习笔记(三)类层级和特质

    无参方法 功能:将方法的定义转换为属性字段的定义: 作用范围:方法中没有参数,并且方法仅能通过读取所包含的对象属性去访问可变状态,而不改变可变状态,就可使用无参方法: 例子: abstract cla ...

  8. scala学习笔记——特质

    一个类扩展自一个或多个特质,以便使用这些特质提供的服务.特质可能会要求使用它的类支持某个特定的特性.不过和java不同,Scala特质可以给出这些特性的缺省实现. 特质的特性: 类可以实现任意数量的特 ...

  9. Scala学习笔记--特质trait

    http://outofmemory.cn/scala/scala-trait-introduce-and-example 与Java相似之处 Scala类型系统的基础部分是与Java非常相像的.Sc ...

随机推荐

  1. C++点和箭头操作符用法区别

    变量是对象的时候用“.”访问 变量是对象指针的时候用“->”访问 例: #inlclude <iostream> using namespace std; class A { pub ...

  2. UX设计秘诀之注册表单设计,细节决定成败

    以下内容由摹客团队翻译整理,仅供学习交流,摹客iDoc是支持智能标注和切图的产品协作设计神器. 说实话,现实生活中,又有多少人会真正喜欢填写表格?显然,并不多.因为填写表单这样的网页或App服务,并非 ...

  3. 使用yarn 安装 Vue-DevTools

    1. 从 github 下载 vuejs/vue-devtools https://github.com/vuejs/vue-devtools/archive/dev.zip 2.安装yarn 及 编 ...

  4. 【Redis】安装及简单使用

    Redis介绍 Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库. Redis 与其他 key - value 缓存产品有以下三个特点: Redis支持数据的持久化 ...

  5. MySQL参数优化:back_log

    * 修改back_log参数值:由默认的50修改为500.(每个连接256kb, 占用:125M) back_log=500 查看mysql 当前系统默认back_log值,命令: show vari ...

  6. Ubuntu显示实时网速CPU内存等参数

    添加库 sudo add-apt-repository ppa:fossfreedom/indicator-sysmonitor 更新软件列表 sudo apt-get update 安装indica ...

  7. 2018.11.01 NOIP训练 cost数(搜索+容斥原理)

    传送门 唉考试的时候忘记剪倍数的枝了666666分滚粗. 其实就是一直取lcmlcmlcm搜索,然后容斥原理统计就行了. 代码

  8. while (~scanf("%d%d",&m,&n))什么用的?

    ACM中比较常见,其功能是循环从输入流读取m和n,直到遇到EOF为止,等同于while (scanf("%d%d",&m,&n)!=EOF). scanf()函数返 ...

  9. openstack 租户、用户管理

    创建domain [root@cc01 ~]# openstack domain create --description "Default Domain" default +-- ...

  10. mysql的myBatis,主键自增设置

    方法一: insert id="insert" parameterType="Person" useGeneratedKeys="true" ...