Chinaunix首页 | 论坛 | 博客
  • 博客访问: 7068170
  • 博文数量: 702
  • 博客积分: 10821
  • 博客等级: 上将
  • 技术积分: 12031
  • 用 户 组: 普通用户
  • 注册时间: 2005-12-02 10:41
个人简介

中科院云平台架构师,专注于数字化、智能化,技术方向:云、Linux内核、AI、MES/ERP/CRM/OA、物联网、传感器、大数据、ML、微服务。

文章分类

全部博文(702)

分类: 大数据

2015-09-24 11:14:17

trait中可以实现部分方法.
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则如其名字,表示一种特征,可以多继承。

阅读(3347) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

qq16341518732015-10-20 15:41:20

http://kunming.seo789.net/