W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
Trait 的一種主要應(yīng)用方式是可以根據(jù)類已有的方法自動(dòng)為類添加方法。也就是說,Trait 可以使得一個(gè)瘦接口變得豐滿些,把它變成胖接口。
選擇瘦接口還是胖接口的體現(xiàn)了面向?qū)ο笤O(shè)計(jì)中常會(huì)面臨的在實(shí)現(xiàn)者與接口用戶之間的權(quán)衡。胖接口有更多的方法,對(duì)于調(diào)用者來說更便捷??蛻艨梢該煲粋€(gè)完全符合他們功能需要的方法。另一方面瘦接口有較少的方法,對(duì)于實(shí)現(xiàn)者來說更簡單。然而調(diào)用瘦接口的客戶因此要寫更多的代碼。由于沒有更多可選的方法調(diào)用,他們或許不得不選一個(gè)不太完美匹配他們所需的方法并為了使用它寫一些額外的代碼。
Java 的接口常常是過瘦而非過胖。例如,從 Java 1.4 開始引入的 CharSequence 接口,是對(duì)于字串類型的類來說通用的瘦接口,它持有一個(gè)字符序列。下面是把它看作 Scala 中 Trait 的定義:
trait CharSequence {
def charAt(index: Int): Char
def length: Int
def subSequence(start: Int, end: Int): CharSequence
def toString(): String
}
盡管類 String 成打的方法中的大多數(shù)都可以用在任何 CharSequence 上,Java 的 CharSequence 接口定義僅提供了 4 個(gè)方法。如果 CharSequence 代以包含全部 String 接口,那它將為 CharSequence 的實(shí)現(xiàn)者壓上沉重的負(fù)擔(dān)。任何實(shí)現(xiàn) Java 里的 CharSequence 接口的程序員將不得不定義一大堆方法。因?yàn)?Scala 的 Trait 可以包含具體方法,這使得創(chuàng)建胖接口大為便捷。
在 Trait 中添加具體方法使得胖瘦對(duì)陣的權(quán)衡大大傾向于胖接口。不像在 Java 里那樣,在 Scala 中添加具體方法是一次性的勞動(dòng)。你只要在 Trait 中實(shí)現(xiàn)方法一次,而不再需要在每個(gè)混入 Trait 的方法中重新實(shí)現(xiàn)它。因此,與沒有 Trait 的語言相比,Scala 里的胖接口沒什么工作要做。
要使用 Trait 加強(qiáng)接口,只要簡單地定義一個(gè)具有少量抽象方法的 Trait——Trait 接口的瘦部分——和潛在的大量具體方法,所有的都實(shí)現(xiàn)在抽象方法之上。然后你就可以把豐滿了的 Trait 混入到類中,實(shí)現(xiàn)接口的瘦部分,并最終獲得具有全部胖接口內(nèi)容的類。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: