scala中的trait

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了scala中的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")
  }
}
View Code

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

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

技术分享
trait Flyable {
  def hasFeather = true
  def fly
}
trait Swimable {
  def swim
}
View Code

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

下面我们定义一种动物,它既会飞也会游泳,这种动物是鱼鹰 FishEagle,我们看下代码:

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

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

fish eagle fly fast 
fish eagle swim fast

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

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

 

以上是关于scala中的trait的主要内容,如果未能解决你的问题,请参考以下文章

scala——关键字trait的使用

关于scala中的class和trait的一些总结

Scala 学习之「trait 」

scala学习笔记-面向对象编程之Trait(13)

scala中trait学习笔记

Scala基础语法之Trait详解