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是一种多范式的编程语言,旨在集成面向对象编程和函数式编程的各种特性。它运行于Java平台(Java虚拟机JVM),并且能够完全兼容所有的Java程序。这使得Scala...
总之,《Programming In Scala》中文版和英文版覆盖了Scala语言的核心概念和高级特性,无论是初学者还是有经验的开发者,都能从中获益匪浅。通过深入学习和实践,开发者能够掌握Scala的精髓,运用到实际项目中,提升...
在"scala学习笔记整理"中,我们可以深入探讨以下关键知识点: 1. **基础语法**:Scala的基础语法与Java有相似之处,但也有很多独特的特点。例如,它支持变量的不可变性(immutability),使用`val`声明常量,`var`...
注意是Programming Scala的第二版,而不是Programming in Scala的第二版,更注重于与Spark相关的知识!强烈推荐!Programming Scala- Scalability = Functional Programming + Objects, 2 edition
- **广泛的覆盖范围**:除了Scala核心语言外,还介绍了如容器、actor等重要的Scala库和框架,为读者提供了更全面的学习资源。 #### 核心语言特性 - **类型推断**:Scala拥有强大的类型系统,可以在很多情况下自动...
Programming Scala(2nd) 英文epub 第2版 本资源转载自网络,如有侵权,请联系上传者或csdn删除 本资源转载自网络,如有侵权,请联系上传者或csdn删除
1. 知名人士对《Programming in Scala》的前一版给予了高度评价。其中提到书中的写作风格清晰、简练,解释深入且容易理解,能有效回答读者在阅读过程中产生的问题。 2. 肯·埃格瓦里(Ken Egervari)作为首席软件...
### Scala学习笔记关键知识点 #### 1. “均码”哲学与并发编程 - **“均码”哲学**: 指的是Scala设计时遵循的一种设计理念,即尽量保持语言的统一性和简洁性,使得不同的功能和特性能够以一种相似的方式进行处理。...
**编程语言Scala深度解析**...通过《Programming in Scala》第三版,读者可以系统地学习这些特性,掌握Scala编程技巧,从而在现代软件开发中充分利用其强大的功能。书中的实例和练习将帮助读者深化理解,提升编程能力。