当前位置:首页 > 开发 > 编程语言 > Scala > 正文

【Scala十二】Scala核心六:Trait

发表于: 2015-02-27   作者:bit1129   来源:转载   浏览:
摘要: Traits are a fundamental unit of code reuse in Scala. A trait encapsulates method and field definitions, which can then be reused by mixing them into classes. Unlike class inheritance, in which each c

Traits are a fundamental unit of code reuse in Scala. A trait encapsulates method and field definitions, which can then be reused by mixing them into classes. Unlike class inheritance, in which each class must inherit from just one superclass, a class can mix in any number of traits. Once a trait is defined, it can be mixed in to a class using either the extends or with keywords.

 

trait类似Java中可以带有实现的接口,Java中有多接口继承,scala中有多trait集成

 

trait相对于普通的类,不管是具体类,还是抽象类,一个重要的差别是trait的主构造函数不能带有参数,

例如

trait ThisIsTrait(arg: String)

 

定义了多个trait的Animal类:

 

package spark.examples.scala.twaits

trait Animal {
  def weight = 0

  //抽象方法
  def speak
}

trait HasLegs {
  def numLegs = 0
}

trait CanClimbTree {
  def canClimeTree = false
}

trait GenericsTrait[T] {
  def get: T
}

trait Getter1 {
  def duplicateGet = 101

  def duplicateGet2 = 1012
}

trait Getter2 {
  def duplicateGet = 102
  def duplicateGet2 = 2012
}

trait Getter3 {
  def getIt = 100
}

//trait跟class的一个重要区别是,trait主构造函数不能有参数,如下错误
/*
trait
 */

 

 mixin trait的具体类:Cat

 

package spark.examples.scala.twaits

//The first one uses Animal; the others use with,one with for each
class Cat(name: String) extends Animal with HasLegs with CanClimbTree with GenericsTrait[Int] with Getter1 with Getter2 with Getter3 {

  override def weight: Int = 3

  override def numLegs: Int = 4

  override def canClimeTree: Boolean = true

  //抽象方法
  override def speak: Unit = {
    println("Miao")
  }

  override def toString: String = {
    "I am a cat: " + name
  }

  override def duplicateGet = 300

  override def get = {
    super.duplicateGet + 100 //为什么super指向的是Getter2而不是Getter1
  }

  override def duplicateGet2 = {
    super.duplicateGet2 + 10001 //为什么super指向的是Getter2而不是Getter1
  }

  override def getIt: Int = {
    super.getIt + 120
  }

}

 

调用程序

 

package spark.examples.scala.twaits


object TwaitTest {
  def main(args: Array[String]) {
    val c = new Cat("kitty")
    c.speak
    println(c.numLegs)
    println(c.canClimeTree)
    println(c.get)
    //两个trait定义了相同的方法并且提供了实现,那么Scala会报方法冲突,解决办法,实体类进行重写
    println(c.duplicateGet)
    //通过super调用父实现
    println(c.getIt)
    println(c.duplicateGet2)
  }
}

 

 问题:在使用super.methodName时,如果多个trait都有那个方法时,为什么一直都是最后一个起作用,如果要让第一个起作用,该如何操作?

 

【Scala十二】Scala核心六:Trait

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
trait类似于Java8中的可用带default method的接口。 trait中可以带有实现的方法,也可以带有抽象方
trait类似于Java8中的可用带default method的接口。 trait中可以带有实现的方法,也可以带有抽象方
trait类似于Java8中的可用带default method的接口。 trait中可以带有实现的方法,也可以带有抽象方
trait类似于Java8中的可用带default method的接口。 trait中可以带有实现的方法,也可以带有抽象方
我的新博客地址:http://cuipengfei.me/blog/2013/10/13/scala-trait/ 我在Coursera上跟了一门叫做F
本节主要内容 trait构造顺序 trait与类的比较 提前定义与懒加载 trait扩展类 self type 1 trait构造
多重继承 package kmust.hjr.learningScala15 /** * Created by Administrator on 2015/7/20. */ cl
Scala的类层级 Scala里,每个类都继承自通用的名为Any的超类。因为所有的类都是Any的子类,所以定义
本节主要内容 Scala I/O操作简介 Scala 写文件 Scala 读文件 Scala 网络I/O 正则表达式简介 Scala正
根据Play!开发团队透露,团队正在着力开发Play的下一个主要版本(也就是Play 2.0),该版本集成了一
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号