Scala Trait详解

無名 发表于: 2016-06-14   最后更新时间: 2016-06-18 22:49:37  
{{totalSubscript}} 订阅, 4,294 游览

Scala Trait详解

除了从父类集成代码外,Scala中的类还允许从一个或者多个traits中导入代码。
对于Java程序员来说理解traits的最好方法就是把他们当作可以包含代码的接口(interface)。在Scala中,当一个类继承一个trait时,它就实现了这个trait的接口,同时还从这个trait中继承了所有的代码。

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

用Trait来实现混入(mix-in)式的多重继承

Scala的Trait(特征)相当于Java接口。实际上他比接口还功能强大。与接口不同的是,它还可以定义属性和方法的实现。

Scala中特征被用于服务于单一目的功能模块的模块化中。通过混合这种特征(模块)群来实现各种应用程序的功能要求,Scala也是按照这个构想来设计的。

一般情况下Scala的类只能够继承单一父类,但是如果是特征的话就可以继承多个,从结果来看就是实现了多重继承。就看一下下面的例子吧。特征既可以继承类也可以继承其他特征

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

我们先看下Aminmal的实现:

abstract class Animal {
  def walk(speed:Int)

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

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

我们再看下FlyableSwimable两个 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后面有两个withwith Flyablewith Swimable表示也具备两种特征

在类的实现中需要实现抽象类Animalwalk方法,也需要实现两个特征中定义的未实现方法。

下面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对象,然后通过FlyableSwimable trait来分别调用其flyswim方法,输出结果如下:

fish eagle fly fast 
fish eagle swim fast

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

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

更新于 2016-06-18

查看scala更多相关的文章或提一个关于scala的问题,也可以与我们一起分享文章