scala-13  Scala中作为接口的trait、在对象中混入trait代码实战

Scala中作为接口的trait、在对象中混入trait代码实战

Scala中的trait类型于Java中的interface,但比interface强大的多。

Scala语言中trait的定义和使用: 

1)与Java语言中的接口(interface)中只含有抽象方法不同,Scala语言中的特质(trait)可以包含抽象字段、抽象方法或者实现了方法体的方法。 
2)在使用Scala语言构建对象时,可以为该对象添加特质。

trait支持部分实现,也就是说可以在scalatrait中可以实现部分方法。

我们的例子中定义了一个抽象类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)   		
<span style="white-space:pre">	</span>def swim() = println("fish eagle swim fast")   
  def fly() = println("fish eagle fly fast") 
  }

FishEagle类继承自Animalextends 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 
  } 
  }
<p>在<span style="font-family:Arial;">main</span><span style="font-family:宋体;">方法中,我们首先初始化了一个</span><span style="font-family:Arial;">FishEagle</span><span style="font-family:宋体;">对象,然后通过</span><span style="font-family:Arial;">Flyable</span><span style="font-family:宋体;">和</span><span style="font-family:Arial;">Swimable trait</span><span style="font-family:宋体;">来分别调用其</span><span style="font-family:Arial;">fly</span><span style="font-family:宋体;">和</span><span style="font-family:Arial;">swim</span><span style="font-family:宋体;">方法,输出结果如下:</span></p><p><span style="white-space:pre">	</span>fish eagle fly fast  </p><p><span style="white-space:pre">	</span>fish eagle swim fast</p><p>trait<span style="font-family:宋体;">的使用方法就是这样子了,它很强大,抽象类能做的事情,</span><span style="font-family:Arial;">trait</span><span style="font-family:宋体;">都可以做。它的长处在于可以多继承。</span></p><p>trait<span style="font-family:宋体;">和抽象类的区别在于抽象类是对一个继承链的,类和类之前确实有父子类的继承关系,而</span><span style="font-family:Arial;">trait</span><span style="font-family:宋体;">则如其名字,表示一种特征,可以多继承。</span></p>



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值