文档章节

scala中的trait

l
 lry77
发布于 2016/08/11 10:35
字数 573
阅读 7
收藏 0
点赞 0
评论 0

这里的trait字面意思是特质或者特征,这个词翻译成特征比较合适。它的意义和java,c#中接口很类似。但是trait支持部分实现,也就是说可以在scala的trait中可以实现部分方法。

下面我们以一个具体的例子来介绍下trait的使用。

我们的例子中定义了一个抽象类Aminal表示所有的动物,然后定义了两个trait Flyable和Swimable分别表示会飞和会游泳两种特征。

我们先看下Aminmal的实现:

abstract class Animal {
  def walk(speed:Int)

  def breathe() = {
    println("animal breathes")
  }
}

这里的抽象类Animal定义了walk方法,实现了breathe方法。

我们再看下Flyable和Swimable两个 trait的实现:

trait Flyable {
  def hasFeather = true
  def fly
}
trait Swimable {
  def swim
}

注意Flyable trait中有两个方法,一个是hasFeather方法,这个方法已经实现了,另一个方法是fly方法,这个方法只是定义没有实现,而Swimable trait只是定义个一个swim的方法,没有具体实现。

下面我们定义一种动物,它既会飞也会游泳,这种动物是鱼鹰 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方法,也需要实现两个特征中定义的未实现方法。

下面main方法代码:

object App { 
 def main(args : Array[String]) { 
 val fishEagle = new FishEagle 
 val flyable:Flyable = fishEagle 
 flyable.fly 
 
 val swimmer:Swimable = fishEagle 
 swimmer.swim 
 } 
}

 在main方法中,我们首先初始化了一个FishEagle对象,然后通过Flyable和Swimable trait来分别调用其fly和swim方法,输出结果如下:

fish eagle fly fast 
fish eagle swim fast

trait的使用方法就是这样子了,它很强大,抽象类能做的事情,trait都可以做。它的长处在于可以多继承。

trait和抽象类的区别在于抽象类是对一个继承链的,类和类之前确实有父子类的继承关系,而trait则如其名字,表示一种特征,可以多继承。

本文转载自:http://outofmemory.cn/scala/scala-trait-introduce-and-example

共有 人打赏支持
l
粉丝 1
博文 115
码字总数 73606
作品 0
南京
Scala简单编程

1. Scala简单概述 Scala是多范式编程语言,其设计的初衷是要集成面向对象编程和函数式编程以及各种特性. 需要说明的一点是: Scala是基于java平台(JVM) ,并兼容现有的Java程序 下面是Scala官方...

得失与否
01/01
0
0
关于Scala多重继承的菱形问题

在Scala中的trait中引入了混入的概念,即Mixin of trait。 什么是混入(mixin) 可能翻译不准确,有人也称之为混入类(mixins),混入是一种组合的抽象类,主要用于多继承上下文中为一个类添加...

Barudisshu
2015/05/25
0
1
Scala中trait的使用详情

单基础多实现,但是接口只能包含抽象方法,不能包含字段。 trait可以同时拥有抽象方法和具体方法,而类可以实现多个trait。 做接口使用的trait trait Logger{ } 不需要将方法声明为abstract—...

LC900730的博客
2017/12/18
0
0
【Spark亚太研究院系列丛书】Spark实战高手之路-第2章动手实战Scala第2小节(2)

3,动手实战Scala中的抽象类 抽象类的定义需要使用abstract关键字: 上面的代码定义并实现了抽象方法,需要注意的是我们把直接运行的代码放在了App这个trait的子类中,关于App内部帮助我们实...

Spark亚太研究院
2014/11/27
0
0
Scala&Android下的开发trait经验分享

前一段时间写了一个在Android中加入AdMob的博客,详见http://my.oschina.net/noahxiao/blog/61987 还有一个用Scala开发Android应用-使用trait与implicit优化Activity,详见http://my.oschina...

NoahX
2012/06/19
0
0
Play! 1.1 框架中的 Scala 模块

Play! 1.1 包含了对 Scala 编程语言的支持,由于 Play 框架的灵活性,使得通过一个简单的模块即可支持 Scala ,要启用 Scala 支持只需要在 conf/application.conf 文件中配置: 接下来就可以...

红薯
2011/01/11
1K
3
scala class和object,trait的区别

Scala类 class Counter { private var value = 0 // 必须初始化字段 def increment() { value += 1 } // 方法默认公有 def current = value // 调用必须是myCounter.current这种风格}class ......

蓝狐乐队
2016/01/19
4.2K
0
Scala堆叠Traits实现对方法的增强

Scala堆叠Traits实现对方法的增强 简单的来说,堆叠Trait类似于AOP,实现对方法功能的增强,而不去修改原有方法的逻辑。 比如我们实现一个队列,我们可以定义一个队列的抽象类,实现入队和出...

秋风醉了
2015/08/12
0
0
再谈Scala集合

集合!集合!一个现代语言平台上的程序员每天代码里用的最多的大概就是该语言上的集合类了,Scala的集合丰富而强大,至今无出其右者,所以这次再回过头再梳理一下。 本文原文出处: 本文原文链...

bluishglc
2017/12/14
0
0
浅谈Scala的特质(trait)

虽然scala的特征相当于Java的接口,但是在使用上,我觉得scala的特征更像抽象类。 比如我们要开发一个2D图形库,必然涉及到矩形对象的定义。 一个矩形可以由对角线上的两个端点唯一确定。矩形...

mj4738
2011/11/14
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

pbgo: 基于Protobuf的迷你RPC/REST框架

https://www.oschina.net/p/pbgo

chai2010
33分钟前
0
0
rsync工具介绍、常用选项以及通过ssh同步

linux下的文件同步工具 rsync rsync是非常实用的一个同步工具,可以从a机器到b机器传输一个文件,也可以备份数据,系统默认没有这个工具,要使用命令 yum install -y rsync 安装。 rsync的命...

黄昏残影
49分钟前
0
0
OSChina 周四乱弹 —— 表妹要嫁人 舅妈叮嘱……

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @哈哈哈哈哈嗝:一定要听——The Pancakes的单曲《咁咁咁》 《咁咁咁》- The Pancakes 手机党少年们想听歌,请使劲儿戳(这里) @clouddyy :...

小小编辑
今天
245
4
流利阅读笔记30-20180719待学习

重磅:让人类得老年痴呆的竟是它? Lala 2018-07-19 1.今日导读 去年奥斯卡最佳动画长片《寻梦环游记》里有一句经典台词:“比死亡更可怕的,是遗忘”。在电影中,年迈的曾祖母会重复说一样的...

aibinxiao
今天
3
0
1.16 Linux机器相互登录

Linux机器之间以密码方式互相登录 运行命令#ssh [ip address],标准命令:#ssh [username]@ip, 如果没有写用户名,则默认为系统当前登录的用户 命令#w查看系统负载,可查看到连接到该主机的...

小丑鱼00
今天
0
0
about git flow

  昨天元芳做了git分支管理规范的分享,为了拓展大家关于git分支的认知,这里我特意再分享这两个关于git flow的链接,大家可以看一下。 Git 工作流程 Git分支管理策略   git flow本质上是...

qwfys
今天
2
0
Linux系统日志文件

/var/log/messages linux系统总日志 /etc/logrotate.conf 日志切割配置文件 参考https://my.oschina.net/u/2000675/blog/908189 dmesg命令 dmesg’命令显示linux内核的环形缓冲区信息,我们可...

chencheng-linux
今天
1
0
MacOS下给树莓派安装Raspbian系统

下载镜像 前往 树莓派官网 下载镜像。 点击 最新版Raspbian 下载最新版镜像。 下载后请,通过 访达 双击解压,或通过 unzip 命令解压。 检查下载的文件 ls -lh -rw-r--r-- 1 dingdayu s...

dingdayu
今天
1
0
spring boot使用通用mapper(tk.mapper) ,id自增和回显等问题

最近项目使用到tk.mapper设置id自增,数据库是mysql。在使用通用mapper主键生成过程中有一些问题,在总结一下。 1、UUID生成方式-字符串主键 在主键上增加注解 @Id @GeneratedValue...

北岩
今天
2
0
告警系统邮件引擎、运行告警系统

告警系统邮件引擎 cd mail vim mail.py #!/usr/bin/env python#-*- coding: UTF-8 -*-import os,sysreload(sys)sys.setdefaultencoding('utf8')import getoptimport smtplibfr......

Zhouliang6
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部