`
bit1129
  • 浏览: 1051391 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

【Scala十二】Scala核心六:Trait

 
阅读更多

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编程详解 第21讲-Scala编程详解:Actor入门 共8页.pptx

    第15讲-Scala编程详解:面向对象编程之Trait 共14页 第16讲-Scala编程详解:函数式编程 共14页 第17讲-Scala编程详解:函数式编程之集合操作 共9页 第18讲-Scala编程详解:模式匹配 共11页 第19讲-Scala编程详解:...

    Scala编程详解 第19讲-Scala编程详解:类型参数 共13页.pptx

    第15讲-Scala编程详解:面向对象编程之Trait 共14页 第16讲-Scala编程详解:函数式编程 共14页 第17讲-Scala编程详解:函数式编程之集合操作 共9页 第18讲-Scala编程详解:模式匹配 共11页 第19讲-Scala编程详解:...

    Scala编程详解 第4讲-Scala编程详解:条件控制与循环 共7页.pptx

    第15讲-Scala编程详解:面向对象编程之Trait 共14页 第16讲-Scala编程详解:函数式编程 共14页 第17讲-Scala编程详解:函数式编程之集合操作 共9页 第18讲-Scala编程详解:模式匹配 共11页 第19讲-Scala编程详解:...

    Scala编程详解 第14讲-Scala编程详解:面向对象编程之继承 共13页.pptx

    第15讲-Scala编程详解:面向对象编程之Trait 共14页 第16讲-Scala编程详解:函数式编程 共14页 第17讲-Scala编程详解:函数式编程之集合操作 共9页 第18讲-Scala编程详解:模式匹配 共11页 第19讲-Scala编程详解:...

    Scala编程详解 第13讲-Scala编程详解:面向对象编程之对象 共9页.pptx

    第15讲-Scala编程详解:面向对象编程之Trait 共14页 第16讲-Scala编程详解:函数式编程 共14页 第17讲-Scala编程详解:函数式编程之集合操作 共9页 第18讲-Scala编程详解:模式匹配 共11页 第19讲-Scala编程详解:...

    Scala编程详解 第12讲-Scala编程详解:面向对象编程之类 共12页.pptx

    第15讲-Scala编程详解:面向对象编程之Trait 共14页 第16讲-Scala编程详解:函数式编程 共14页 第17讲-Scala编程详解:函数式编程之集合操作 共9页 第18讲-Scala编程详解:模式匹配 共11页 第19讲-Scala编程详解:...

    Scala编程详解 第8讲-Scala编程详解:函数入门之过程、lazy值和异常 共5页.pptx

    第15讲-Scala编程详解:面向对象编程之Trait 共14页 第16讲-Scala编程详解:函数式编程 共14页 第17讲-Scala编程详解:函数式编程之集合操作 共9页 第18讲-Scala编程详解:模式匹配 共11页 第19讲-Scala编程详解:...

    Scala编程详解 第9讲-Scala编程详解:数组操作之Array、ArrayBuffer以及遍历数组 共7页.pptx

    第15讲-Scala编程详解:面向对象编程之Trait 共14页 第16讲-Scala编程详解:函数式编程 共14页 第17讲-Scala编程详解:函数式编程之集合操作 共9页 第18讲-Scala编程详解:模式匹配 共11页 第19讲-Scala编程详解:...

    Scala Trait(特质).html

    Scala Trait(特征) 1.Scala中没有接口(interface)的概念 2.特质用于在类之间共享程序接口和字段,类似Java接口 3.特质是字段和方法的集合,可以提供字段和方法实现 4.类和单例对象都可以扩展特质(extends) 5....

    Scala程序设计(第2版)

    3.14 Trait:Scala语言的接口和“混入” 83 3.15 本章回顾与下一章提要 85 第4章 模式匹配 86 4.1 简单匹配 86 4.2 match中的值、变量和类型 87 4.3 序列的匹配 90 4.4 元组的匹配 94 4.5 ...

    scala-cheatsheet:该项目将有助于向已经熟悉Java的人讲授Scala。

    Scala基本的OOP组件包括: class , trait , object class DemoClassAtrait DemoTraitAobject DemoObjectA Java之间的一些基本差异JavaScala类(仅非静态) 班级类(仅静态) 目的字段,方法,构造函数字段(var,...

    Scala and Spark for Big Data Analytics.pdf

    Chapter 1, Introduction to Scala, will teach big data analytics using the Scalabased APIs of Spark. Spark itself is written with Scala and naturally, as a starting point, we will discuss a brief ...

    scala-2.12.1 sdk

    scala 2.12.1 linux unix版

    Scala考试题1

    1.var,val和def三个关键字之间的区别 2.trait(特质)和abstract class(抽象类)的区别 3.object和class的区别 4.c

    scala从入门到精通技术教学视频

    第六章 面向对象入门 00.导学 01.类和对象的相关概念 02.创建类和对象 03.创建类和对象的简写形式 04.定义和访问成员变量 05.使用下划线初始化成员变量 06.定义和访问成员方法 07.访问权限修饰符 08.主构造...

    Scala—— 10.trait特质(接口)(未完待续)

    Scala语言中,采用特质trait(特征)来代替接口的概念,也就是说,多个类具有相同的特质(特征)时,就可以将这个特质(特征)独立出来,采用关键字trait声明。理解trait等价于(interface+abstract class)。 1.trait的声明...

    scala-2.9.2.jar

    import scala.annotation._ trait Func[T] { val zero: T def inc(t: T): T def dec(t: T): T def in: T def out(t: T): Unit } object ByteFunc extends Func[Byte] { override val zero: Byte = 0 ...

    Scala详细总结(精辟版++)

    这是我学习scala时做的笔记,应该比较全面,对于初学scala足够了。文档排版整齐、方便阅读。 另外,我在百度文库也上传过一份,不过csdn上的版本是最新的。希望可以帮助到你。 --------- 目录 --------- 概述 1 ...

    大数据—Scala

    二、课程内容和目标本课程重点讲解Scala核心编程,内容包括: Scala语言概述、运算符、程序流程控制、数据结构之集合、Map映射、过滤、化简、折叠、扫描、拉链、视图、并行集合、高阶函数、函数柯里化、偏函数、参数...

    Scala for the Impatient 2nd (完整英文第二版 带书签)

    《快学Scala》英文第二版: Scala for the Impatient Second Edition Cay S. Horstmann 目录: 1 THE BASICS A1 1 1.1 The Scala Interpreter 1 1.2 Declaring Values and Variables 4 1.3 Commonly Used Types 5 ...

Global site tag (gtag.js) - Google Analytics