您好,登錄后才能下訂單哦!
這篇文章主要講解了“Scala調(diào)用超類構(gòu)造器和override修飾符的使用方法”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“Scala調(diào)用超類構(gòu)造器和override修飾符的使用方法”吧!
調(diào)用超類構(gòu)造器
現(xiàn)在你有了兩個(gè)類組成的完整系統(tǒng):抽象類Element,和擴(kuò)展它的具體類ArrayElement。或許你還在設(shè)想其它表達(dá)元素的方式。比方說(shuō),客戶或許想要?jiǎng)?chuàng)造由給定單行字串構(gòu)成的布局元素。面向?qū)ο缶幊套屖褂眯聰?shù)據(jù)變體擴(kuò)展系統(tǒng)變得容易。只要加入子類即可。例如,代碼10.6展示了擴(kuò)展ArrayElement的LineElement類:
class LineElement(s: String) extends ArrayElement(Array(s)) { override def width = s.length override def height = 1 }
代碼 10.6 調(diào)用超類構(gòu)造器
由于LineElement擴(kuò)展了ArrayElement,并且ArrayElement的構(gòu)造器帶一個(gè)參數(shù)(Array[String]),LineElement需要傳遞一個(gè)參數(shù)到它的超類的主構(gòu)造器。要調(diào)用超類構(gòu)造器,只要把你要傳遞的參數(shù)或參數(shù)列表放在超類名之后的括號(hào)里即可。例如,類LineElement傳遞了Array(s)到ArrayElement的主構(gòu)造器,把它放在超類ArrayElement的名稱后面的括號(hào)里:
... extends ArrayElement(Array(s)) ...
有了新的子類,布局元素的繼承級(jí)別現(xiàn)在看起來(lái)就像展示在圖釋10.2中的那樣了。
圖釋 10.2 LineElement的類關(guān)系圖
使用override修飾符
請(qǐng)注意LineElement里width和height的定義帶著override修飾符。你在6.3節(jié)中的 toString方法中看到過(guò)。Scala里所有重載了父類具體成員的成員都需要這樣的修飾符。如果成員實(shí)現(xiàn)的是同名的抽象成員則這個(gè)修飾符是可選的。而如果成員并未重載或?qū)崿F(xiàn)什么其它基類里的成員則禁用這個(gè)修飾符。由于類LineElement的height和width重載了類Element的具體成員定義,override是需要的。
這條規(guī)則給編譯器提供了有用的信息來(lái)幫助避免某些難以捕捉的錯(cuò)誤并使得系統(tǒng)的改進(jìn)更加安全。例如,如果你碰巧拼錯(cuò)了方法名或偶爾傳遞給它不同的參數(shù)列表,編譯器會(huì)回應(yīng)錯(cuò)誤信息:
$ scalac LineElement.scala .../LineElement.scala:50: error: method hight overrides nothing override def hight = 1 ?
系統(tǒng)改進(jìn)的時(shí)候,override公約顯得更重要。假設(shè)你定義了一個(gè)2D畫圖方法庫(kù)。你把它公開,并廣泛使用。庫(kù)的下一個(gè)版本里你想在你的基類Shape里增加一個(gè)使用以下簽名的新方法:
def hidden(): Boolean
你的新方法將被用在許多畫圖方法中去決定是否需要把形狀畫出來(lái)。這或許會(huì)產(chǎn)生顯著的提速,但你不可以冒著破壞客戶代碼的風(fēng)險(xiǎn)做這件事。畢竟客戶說(shuō)不定已經(jīng)使用不同的hidden實(shí)現(xiàn)定義了Shape的子類?;蛟S客戶的方法實(shí)際上是讓對(duì)象消失而不是檢測(cè)是否對(duì)象是隱藏的。因?yàn)檫@兩個(gè)版本的hidden互相重載,你的畫圖方法將停止對(duì)象的消失,這可真不是你想要的!這些“意外的重載”就是被稱為“脆基類”問(wèn)題的最通常的表現(xiàn)。這個(gè)問(wèn)題是指如果你添加了新的成員到類層級(jí)的基類中(通常我們稱為超類),你會(huì)有破壞客戶代碼的風(fēng)險(xiǎn)。
Scala不能完全解決脆基類問(wèn)題,不過(guò)它與Java相比有所改善。Java1.5中,@Override標(biāo)注被引入并與Scala的override修飾符起相同的工作,不過(guò)不像Scala的override,它不是必需的。如果畫圖庫(kù)和它的客戶是用Scala寫的,那么客戶的hidden原始實(shí)現(xiàn)就不會(huì)有override修飾符,因?yàn)檫@時(shí)候還沒(méi)有另外一個(gè)使用那個(gè)名字的方法。一旦你添加了hidden方法到你Shape類的第二個(gè)版本,客戶的重編譯將給出像下列這樣的錯(cuò)誤:
.../Shapes.scala:6: error: error overriding method hidden in class Shape of type ()Boolean; method hidden needs 'override' modifier def hidden(): Boolean = ?
也就是說(shuō),代之以錯(cuò)誤的執(zhí)行,你的客戶將得到一個(gè)編譯期錯(cuò)誤,這常常是更可取的。
感謝各位的閱讀,以上就是“Scala調(diào)用超類構(gòu)造器和override修飾符的使用方法”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)Scala調(diào)用超類構(gòu)造器和override修飾符的使用方法這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。