`

O'REILLY版《Programming Scala》学习笔记——Trait

阅读更多
package ui
import observer._
//with关键字类似JAVA的implements关键字,但是和JAVA不同的是在声明多个traits时每个traits都要有属于自己的with
class ObservableButton(name: String) extends Button(name) with Subject {
  override def click() = {//因为click()是覆盖父类Button的方法,这里不许使用override 
    super.click()
    notifyObservers
  }
}

//If you don’t use extends for the first trait, e.g., you write the following:
// ERROR:
class ObservableButton(name: String) with Button(name) with Subject {...}

引用

You’ll get an error like this:
... error: ';' expected but 'with' found.
class ObservableButton(name: String) with Button(name) with Subject {...}

注意:如果一个Class使用多个traits,但它没有继承其他Class时。第一个traits不能使用with关键字而要改成extends。
//trait中抽象方法或者类不需要加abstract
trait Clickable {
def click()
}

package ui2
import observer._

trait ObservableClicks extends Clickable with Subject {
//这里的方法为什么使用abstract?因为这里的方法体中使用了 super.click()但是它的父trait又没有实现click()方法。使用abstract告诉编译器这个方法没有完全实现。
  abstract override def click() = {
    super.click()
    notifyObservers
  }
}

package ui2
import org.specs._
import observer._
import ui.ButtonCountObserver

object ButtonClickableObserverSpec extends Specification {
  "A Button Observer" should {
    "observe button clicks" in {
      val observableButton = new Button("Okay") with ObservableClicks
      val buttonClickCountObserver = new ButtonCountObserver
      observableButton.addObserver(buttonClickCountObserver)

      for (i <- 1 to 3) observableButton.click()
      buttonClickCountObserver.count mustEqual 3
    }
  }
}
//这里例子展示了在创建Button实例的时候混入了ObservableClicks。本来Button的实例是要求实现一个click()方法的,但是这个工作已经由ObservableClicks完成了。

package ui2
import org.specs._
import observer._
import ui.ButtonCountObserver

object ButtonClickableObserverVetoableSpec extends Specification {
  "A Button Observer with Vetoable Clicks" should {
    "observe only the first button click" in {
     //ObservableClicks和VetoableClicks都实现了click()方法
     //click()方法的覆盖顺序:右边trait的click方法覆盖左边trait的click方法
     //即VetoableClicks.click()中调用super.click()将执行ObservableClicks.click()
      val observableButton = 
          new Button("Okay") with ObservableClicks with VetoableClicks
      val buttonClickCountObserver = new ButtonCountObserver
      observableButton.addObserver(buttonClickCountObserver)

      for (i <- 1 to 3) observableButton.click()
      buttonClickCountObserver.count mustEqual 1
    }
  }
}

trait不支持辅助构造函数,也不支持带参数列表的主构造函数
trait能继承自Class和其他的trait
trait T1 {
  println( "  in T1: x = " + x )
  val x=1
  println( "  in T1: x = " + x )
}
trait T2 {
  println( "  in T2: y = " + y )
  val y="T2"
  println( "  in T2: y = " + y )
}

class Base12 {
  println( "  in Base12: b = " + b )
  val b="Base12"
  println( "  in Base12: b = " + b )
}
class C12 extends Base12 with T1 with T2 {
  println( "  in C12: c = " + c )
  val c="C12"
  println( "  in C12: c = " + c )
}
println( "Creating C12:" )
new C12
println( "After Creating C12" )

上面的代码的输出如下:
引用

Creating C12:
in Base12: b = null
in Base12: b = Base12
in T1: x = 0
in T1: x = 1
in T2: y = null
in T2: y = T2
in C12: c = null
in C12: c = C12
After Creating C12

这个例子中构造函数的执行顺序从Base12 到T1到T2,最后执行的是C12的构造函数。
分享到:
评论

相关推荐

    Scala学习笔记,大全笔记

    Scala学习笔记,大全笔记

    Scala学习笔记(全)

    ### Scala学习笔记(全) #### 一、Scala概述与特点 Scala是一种多范式的编程语言,旨在集成面向对象编程和函数式编程的各种特性。它运行于Java平台(Java虚拟机JVM),并且能够完全兼容所有的Java程序。这使得Scala...

    Programming In Scala 中文版及英文版

    总之,《Programming In Scala》中文版和英文版覆盖了Scala语言的核心概念和高级特性,无论是初学者还是有经验的开发者,都能从中获益匪浅。通过深入学习和实践,开发者能够掌握Scala的精髓,运用到实际项目中,提升...

    scala学习笔记整理

    在"scala学习笔记整理"中,我们可以深入探讨以下关键知识点: 1. **基础语法**:Scala的基础语法与Java有相似之处,但也有很多独特的特点。例如,它支持变量的不可变性(immutability),使用`val`声明常量,`var`...

    Programming Scala- Scalability = Functional Programming + Objects, 2 edition

    注意是Programming Scala的第二版,而不是Programming in Scala的第二版,更注重于与Spark相关的知识!强烈推荐!Programming Scala- Scalability = Functional Programming + Objects, 2 edition

    programming in scala, 3nd edition

    - **广泛的覆盖范围**:除了Scala核心语言外,还介绍了如容器、actor等重要的Scala库和框架,为读者提供了更全面的学习资源。 #### 核心语言特性 - **类型推断**:Scala拥有强大的类型系统,可以在很多情况下自动...

    Programming Scala(2nd) epub

    Programming Scala(2nd) 英文epub 第2版 本资源转载自网络,如有侵权,请联系上传者或csdn删除 本资源转载自网络,如有侵权,请联系上传者或csdn删除

    Programming.in.Scala.pdf

    1. 知名人士对《Programming in Scala》的前一版给予了高度评价。其中提到书中的写作风格清晰、简练,解释深入且容易理解,能有效回答读者在阅读过程中产生的问题。 2. 肯·埃格瓦里(Ken Egervari)作为首席软件...

    Scala学习笔记

    ### Scala学习笔记关键知识点 #### 1. “均码”哲学与并发编程 - **“均码”哲学**: 指的是Scala设计时遵循的一种设计理念,即尽量保持语言的统一性和简洁性,使得不同的功能和特性能够以一种相似的方式进行处理。...

    programming in scala(第三版)

    **编程语言Scala深度解析**...通过《Programming in Scala》第三版,读者可以系统地学习这些特性,掌握Scala编程技巧,从而在现代软件开发中充分利用其强大的功能。书中的实例和练习将帮助读者深化理解,提升编程能力。

Global site tag (gtag.js) - Google Analytics