Scala学习笔记--特质trait
http://outofmemory.cn/scala/scala-trait-introduce-and-example
与Java相似之处
Scala类型系统的基础部分是与Java非常相像的。Scala与Java一样有单一的根类,Java通过接口来实现多重继承,而Scala则通过特征(trait)来实现(Scala的特征可以包含实现代码,这当然是与Java接口不同的。不过由于特征自己具有类型的功能,所以对于没有包含实现代码的特征,可以认为与Java的接口是等价的)
用Trait来实现混入(mix-in)式的多重继承
Scala里相当于Java接口的是Trait(特征)。Trait的英文意思是特质和性状(本文称其为特征),实际上他比接口还功能强大。与接口不同的是,它还可以定义属性和方法的实现。Scala中特征被用于服务于单一目的功能模块的模块化中。通过混合这种特征(模块)群来实现各种应用程序的功能要求,Scala也是按照这个构想来设计的。
一般情况下Scala的类只能够继承单一父类,但是如果是特征的话就可以继承多个,从结果来看就是实现了多重继承。就看一下下面的例子吧。为了辨认方便,此后的特征名称前都加上前缀字母T。特征既可以继承类也可以继承其他特征。
特质的定义除了使用关键字trait以外,与类定义无异
我们再看下Flyable和Swimable两个 trait的实现:
trait Flyable { //特质1
def hasFeather = true
def fly
}
trait Swimable { //特质2
def swim
}
注意Flyable trait中有两个方法,一个是hasFeather方法,这个方法已经实现了,另一个方法是fly方法,这个方法只是定义没有实现,而Swimable trait只是定义个一个swim的方法,没有具体实现。
一旦特质被定义,就可以使用extends或with关键字,把它混入类中。Scala程序员“混入”特质而不是继承它们,因为“混入”与多重继承有明显差异
(1)用extends混入Flyable特质的类,
这种情况下隐式继承了特质的超类。就下面的例子来说,Bird类是AnyRef(AnyRef是Flyable的超类)的子类,并混入了Flyable特质。
class Bird extends Flyable{
def fly()=println("Bird can fly!")
}
特质同样也是类型,可以这么用:
val flyStyle1 : Flyable = new Bird;
val flyStyle2 : Flyable = new Flyable; // 错误的用法
(2)如果想把特质混入显式扩展超类的类里,可以用extends指明待扩展的超类,用with混入特质
我们先定义一个Aminmal类:
abstract class Animal {
def walk(speed:Int) //抽象方法
def breathe() = {
println("animal breathes")
}
}
这里的抽象类Animal定义了walk方法,实现了breathe方法。
下面我们定义一种动物,它既会飞也会游泳,这种动物是鱼鹰 FishEagle,我们看下代码:
class FishEagle extends Animal with Flyable with Swimable {
def walk(speed:Int) = println("fish eagle walk with speed " + speed)
def swim() = println("fish eagle swim fast")
def fly() = println("fish eagle fly fast")
}
FishEagle类继承自Animal,extends Animal后面有两个with,with Flyable和with Swimable,表示也具备两种特征。
在类的实现中需要实现抽象类Animal的walk方法,也需要实现两个特征中定义的未实现方法。
特质类似于带有具体方法的Java接口,不过特质能做更多的事情。
例如,特质可以声明字段和维持状态值。实际上,你可以用特质的定义做任何用类定义能做的事,并且除了以下两点以外连语法都是一样的。
第一点,特质不能有任何“类”参数,即传递给类的主构造器的参数。
eg
class Point(x:Int,y:Int) //正确
trait NoPoint(x:Int,y:Int)//不能编译通过
第二点,不论在类的哪个地方,super调用都是静态绑定的,而在特质中,他们是动态绑定的。
如果在类中写下“super.toString”,你很明确哪个方法实现将被调用。
然而如果在特质中写了同样的东西,在你定义特质的时候super调用的方法实现尚未被定义。调用的实现将在每一次特质被混入到具体类的时候才被决定。
这种处理super的有趣行为是使得特质能以可堆叠的改变方式工作的关键
Scala学习笔记--特质trait的更多相关文章
- scala学习笔记——特质
一个类扩展自一个或多个特质,以便使用这些特质提供的服务.特质可能会要求使用它的类支持某个特定的特性.不过和java不同,Scala特质可以给出这些特性的缺省实现. 特质的特性: 类可以实现任意数量的特 ...
- 基于.net的分布式系统限流组件 C# DataGridView绑定List对象时,利用BindingList来实现增删查改 .net中ThreadPool与Task的认识总结 C# 排序技术研究与对比 基于.net的通用内存缓存模型组件 Scala学习笔记:重要语法特性
基于.net的分布式系统限流组件 在互联网应用中,流量洪峰是常有的事情.在应对流量洪峰时,通用的处理模式一般有排队.限流,这样可以非常直接有效的保护系统,防止系统被打爆.另外,通过限流技术手段,可 ...
- Scala学习笔记及与Java不同之处总结-从Java开发者角度
Scala与Java具有很多相似之处,但又有很多不同.这里主要从一个Java开发者的角度,总结在使用Scala的过程中所面临的一些思维转变. 这里仅仅是总结了部分两种语言在开发过程中的不同,以后会陆续 ...
- Scala学习笔记(七):Application特质
Scala提供了特质scala.Application 在单例对象名后面写上“extends Application”,把想要执行的代码直接放在单例对象的花括号之间 import ChecksumAc ...
- scala 学习笔记十三 特质(转载)
转载地址:https://blog.csdn.net/dwb1015/article/details/51761510 1,介绍 Scala和java一样不允许类从多个超类继承:从多个超类继承可能会导 ...
- 【大数据】Scala学习笔记
第 1 章 scala的概述1 1.1 学习sdala的原因 1 1.2 Scala语言诞生小故事 1 1.3 Scala 和 Java 以及 jvm 的关系分析图 2 1.4 Scala语言的特点 ...
- Scala学习笔记之:tuple、array、Map
[TOC] 本文<快学Scala>的笔记 tuple学习笔记 tuple的定义 对偶是元组(tuple)的最简单形态--元组是不同类型的值的聚集. 元组的值是通过将单个值包含在圆括号中构成 ...
- Scala学习笔记(二)
Scala面向对象: 类: 声明类(一个源文件中可以包含很多public的类) getter和setter 构造函数(主构造器和附属构造器) 继承(extends) 重写父类方法(override d ...
- Scala学习十——特质
一.本章要点 类可以实现任意数量的特质 特质可以要求实现它们的类具备特定的字段,方法或超类 和Java接口不同,Scala特质可以提供方法和字段实现 当你将多个特质叠加在一起时,顺序很重要——其方法先 ...
随机推荐
- mongodb and .net
http://www.codeproject.com/Tips/684801/Connecting-NET-Application-to-MongoDB http://www.codeproject. ...
- 关于51单片机P0口的结构及上拉问题
1.P0作为地址数据总线时,V1和V2是一起工作的,构成推挽结构.高电平时,V1打开,V2截止:低电平时,V1截止,V2打开.这种情况下不用外接上拉电阻.而且,当V1打开,V2截止,输出高电平的时候, ...
- 2个Web上传组件
http://www.uploadify.com/download/ http://gmupload.tanjun.com.cn/
- POJ-魔兽世界之一:备战
描述 魔兽世界的西面是红魔军的司令部,东面是蓝魔军的司令部.两个司令部之间是依次排列的若干城市. 红司令部,City 1,City 2,……,City n,蓝司令部 两军的司令部都会制造武士.武士一共 ...
- C++ 哈希表
从2011年开始,C++支持非排序的unordered_map和unordered_set(原先的map和set都是通过有序结构实现的) 下面是一些性能上的测试 #include<iostrea ...
- UVa 1366 - Martian Mining (dp)
本文出自 http://blog.csdn.net/shuangde800 题目链接: 点击打开链接 题目大意 给出n*m网格中每个格子的A矿和B矿数量,A矿必须由右向左运输,B矿必须由下向上运输 ...
- springboot中的406(Not Acceptable)错误
今天遇到一个很奇怪的问题,我用springboot开发时,用ajax请求服务想返回json数据,页面总是报406错误,这个错误使我郁闷了很久,原来我的后台服务是这么写的 看到没value的后面有个.h ...
- Android Game
收起相关游戏 cytus 机械迷城 小小炼狱 deemo 神庙逃离 现代战争4零点行动 植物大战僵尸2中文版 时空幻境 无尽之剑3 超级救火队 迷你冲撞 大战僵尸鸟 侍魂2 flappy bird 混 ...
- android 限制adb的访问目录
最近有个特殊的要求,engneer版本既要可以adb访问,且adb有的目录不能访问 如/data/目录. 用传统的chmod chgrp等无法满足客户需求,只能修改内核文件系统部分. 添加函数,检查路 ...
- 移动web开发框架研究
纯粹的总结一下移动web开发框架,移动web开发框架有jQuery Mobile .Sencha Touch等等,他们都来源于web开发,是成熟的框架.jQuery Mobile出自于jQuery家族 ...