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 {

。。。

掃碼查看歷史消息,可得到完整版文章!

相關文章
相關標籤/搜索