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都有那个方法时,为什么一直都是最后一个起作用,如果要让第一个起作用,该如何操作?
相关推荐
第15讲-Scala编程详解:面向对象编程之Trait 共14页 第16讲-Scala编程详解:函数式编程 共14页 第17讲-Scala编程详解:函数式编程之集合操作 共9页 第18讲-Scala编程详解:模式匹配 共11页 第19讲-Scala编程详解:...
第15讲-Scala编程详解:面向对象编程之Trait 共14页 第16讲-Scala编程详解:函数式编程 共14页 第17讲-Scala编程详解:函数式编程之集合操作 共9页 第18讲-Scala编程详解:模式匹配 共11页 第19讲-Scala编程详解:...
第15讲-Scala编程详解:面向对象编程之Trait 共14页 第16讲-Scala编程详解:函数式编程 共14页 第17讲-Scala编程详解:函数式编程之集合操作 共9页 第18讲-Scala编程详解:模式匹配 共11页 第19讲-Scala编程详解:...
第15讲-Scala编程详解:面向对象编程之Trait 共14页 第16讲-Scala编程详解:函数式编程 共14页 第17讲-Scala编程详解:函数式编程之集合操作 共9页 第18讲-Scala编程详解:模式匹配 共11页 第19讲-Scala编程详解:...
第15讲-Scala编程详解:面向对象编程之Trait 共14页 第16讲-Scala编程详解:函数式编程 共14页 第17讲-Scala编程详解:函数式编程之集合操作 共9页 第18讲-Scala编程详解:模式匹配 共11页 第19讲-Scala编程详解:...
第15讲-Scala编程详解:面向对象编程之Trait 共14页 第16讲-Scala编程详解:函数式编程 共14页 第17讲-Scala编程详解:函数式编程之集合操作 共9页 第18讲-Scala编程详解:模式匹配 共11页 第19讲-Scala编程详解:...
第15讲-Scala编程详解:面向对象编程之Trait 共14页 第16讲-Scala编程详解:函数式编程 共14页 第17讲-Scala编程详解:函数式编程之集合操作 共9页 第18讲-Scala编程详解:模式匹配 共11页 第19讲-Scala编程详解:...
第15讲-Scala编程详解:面向对象编程之Trait 共14页 第16讲-Scala编程详解:函数式编程 共14页 第17讲-Scala编程详解:函数式编程之集合操作 共9页 第18讲-Scala编程详解:模式匹配 共11页 第19讲-Scala编程详解:...
Scala Trait(特征) 1.Scala中没有接口(interface)的概念 2.特质用于在类之间共享程序接口和字段,类似Java接口 3.特质是字段和方法的集合,可以提供字段和方法实现 4.类和单例对象都可以扩展特质(extends) 5....
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基本的OOP组件包括: class , trait , object class DemoClassAtrait DemoTraitAobject DemoObjectA Java之间的一些基本差异JavaScala类(仅非静态) 班级类(仅静态) 目的字段,方法,构造函数字段(var,...
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 linux unix版
1.var,val和def三个关键字之间的区别 2.trait(特质)和abstract class(抽象类)的区别 3.object和class的区别 4.c
第六章 面向对象入门 00.导学 01.类和对象的相关概念 02.创建类和对象 03.创建类和对象的简写形式 04.定义和访问成员变量 05.使用下划线初始化成员变量 06.定义和访问成员方法 07.访问权限修饰符 08.主构造...
Scala语言中,采用特质trait(特征)来代替接口的概念,也就是说,多个类具有相同的特质(特征)时,就可以将这个特质(特征)独立出来,采用关键字trait声明。理解trait等价于(interface+abstract class)。 1.trait的声明...
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足够了。文档排版整齐、方便阅读。 另外,我在百度文库也上传过一份,不过csdn上的版本是最新的。希望可以帮助到你。 --------- 目录 --------- 概述 1 ...
二、课程内容和目标本课程重点讲解Scala核心编程,内容包括: Scala语言概述、运算符、程序流程控制、数据结构之集合、Map映射、过滤、化简、折叠、扫描、拉链、视图、并行集合、高阶函数、函数柯里化、偏函数、参数...
《快学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 ...