Scala 学习(8)之「trait (2) 」

trait调用链

  • Scala 中支持让类继承多个 trait 后,依次调用多个 trait 中的同一个方法,只要让多个 trait 的同一个方法中,在最后都执行super.方法便可
  • 类中调用多个 trait 中都有的这个方法时,首先会从最右边的 trait 的方法开始执行,而后依次往左执行,造成一个调用链条
  • 这种特性很是强大,其实就至关于设计模式中的责任链模式的一种具体实现依赖
trait Handler {
	def handle(data: String) {}	//方法
}
trait DataValidHandler extends Handler {
	override def handle(data: String) {		//覆盖并实现父类的方法
		println("check data: " + data)
		super.handle(data)
	} 
}
trait SignatureValidHandler extends Handler {
	override def handle(data: String) {		//覆盖并实现父类的方法
		println("check signature: " + data)
		super.handle(data)
	}
}
class Person(val name: String) extends SignatureValidHandler with DataValidHandler {
	def sayHello = { println("Hello, " + name); handle(name) }
}

val person = new Person("0mifang")
// Hello, 0mifang
// check data: 0mifang
// check signature: 0mifang
person.sayHello

在 trait 中覆盖抽象方法

覆盖时,若是使用了super.方法的代码,则没法经过编译。由于super.方法就会去调用父 trait 的抽象方法,此时子 trait 的该方法仍是会被认为是抽象的,此时若是要经过编译,就得给子 trait 的方法加上 abstract override 修饰设计模式

trait Logger {
	def log(msg: String)
}
trait MyLogger extends Logger {
	abstract override def log(msg: String) { super.log(msg) }
}

混合使用 trait 的具体方法和抽象方法

  • 能够让具体方法依赖于抽象方法,而抽象方法则放到继承 trait 的类中去实现
  • 这种 trait 其实就是设计模式中的模板设计模式的体现
trait Valid {
	def getName: String	//抽象方法
	def valid: Boolean = {	//检验输入名称的方法
		getName == "0mifang"    
	}
}
class Person(val name: String) extends Valid {

。。。

扫码查看历史消息,可得到完整版文章!

相关文章
相关标签/搜索