新聞中心
調(diào)用超類構(gòu)造器

公司主營業(yè)務(wù):做網(wǎng)站、網(wǎng)站設(shè)計、移動網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。創(chuàng)新互聯(lián)是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團(tuán)隊有機(jī)會用頭腦與智慧不斷的給客戶帶來驚喜。創(chuàng)新互聯(lián)推出南寧免費(fèi)做網(wǎng)站回饋大家。
現(xiàn)在你有了兩個類組成的完整系統(tǒng):抽象類Element,和擴(kuò)展它的具體類ArrayElement?;蛟S你還在設(shè)想其它表達(dá)元素的方式。比方說,客戶或許想要創(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)造器
編輯推薦:Scala編程語言專題
由于LineElement擴(kuò)展了ArrayElement,并且ArrayElement的構(gòu)造器帶一個參數(shù)(Array[String]),LineElement需要傳遞一個參數(shù)到它的超類的主構(gòu)造器。要調(diào)用超類構(gòu)造器,只要把你要傳遞的參數(shù)或參數(shù)列表放在超類名之后的括號里即可。例如,類LineElement傳遞了Array(s)到ArrayElement的主構(gòu)造器,把它放在超類ArrayElement的名稱后面的括號里:
- ... extends ArrayElement(Array(s)) ...
有了新的子類,布局元素的繼承級別現(xiàn)在看起來就像展示在圖釋10.2中的那樣了。
圖釋 10.2 LineElement的類關(guān)系圖
使用override修飾符
請注意LineElement里width和height的定義帶著override修飾符。你在6.3節(jié)中的 toString方法中看到過。Scala里所有重載了父類具體成員的成員都需要這樣的修飾符。如果成員實(shí)現(xiàn)的是同名的抽象成員則這個修飾符是可選的。而如果成員并未重載或?qū)崿F(xiàn)什么其它基類里的成員則禁用這個修飾符。由于類LineElement的height和width重載了類Element的具體成員定義,override是需要的。
這條規(guī)則給編譯器提供了有用的信息來幫助避免某些難以捕捉的錯誤并使得系統(tǒng)的改進(jìn)更加安全。例如,如果你碰巧拼錯了方法名或偶爾傳遞給它不同的參數(shù)列表,編譯器會回應(yīng)錯誤信息:
- $ scalac LineElement.scala
- .../LineElement.scala:50:
- error: method hight overrides nothing
- override def hight = 1
- ?
系統(tǒng)改進(jìn)的時候,override公約顯得更重要。假設(shè)你定義了一個2D畫圖方法庫。你把它公開,并廣泛使用。庫的下一個版本里你想在你的基類Shape里增加一個使用以下簽名的新方法:
- def hidden(): Boolean
你的新方法將被用在許多畫圖方法中去決定是否需要把形狀畫出來。這或許會產(chǎn)生顯著的提速,但你不可以冒著破壞客戶代碼的風(fēng)險做這件事。畢竟客戶說不定已經(jīng)使用不同的hidden實(shí)現(xiàn)定義了Shape的子類?;蛟S客戶的方法實(shí)際上是讓對象消失而不是檢測是否對象是隱藏的。因?yàn)檫@兩個版本的hidden互相重載,你的畫圖方法將停止對象的消失,這可真不是你想要的!這些“意外的重載”就是被稱為“脆基類”問題的最通常的表現(xiàn)。這個問題是指如果你添加了新的成員到類層級的基類中(通常我們稱為超類),你會有破壞客戶代碼的風(fēng)險。
Scala不能完全解決脆基類問題,不過它與Java相比有所改善。Java1.5中,@Override標(biāo)注被引入并與Scala的override修飾符起相同的工作,不過不像Scala的override,它不是必需的。如果畫圖庫和它的客戶是用Scala寫的,那么客戶的hidden原始實(shí)現(xiàn)就不會有override修飾符,因?yàn)檫@時候還沒有另外一個使用那個名字的方法。一旦你添加了hidden方法到你Shape類的第二個版本,客戶的重編譯將給出像下列這樣的錯誤:
- .../Shapes.scala:6: error: error overriding method
- hidden in class Shape of type ()Boolean;
- method hidden needs 'override' modifier
- def hidden(): Boolean =
- ?
也就是說,代之以錯誤的執(zhí)行,你的客戶將得到一個編譯期錯誤,這常常是更可取的。
【相關(guān)閱讀】
- Scala:重載方法和字段及定義參數(shù)化字段
- Scala程序中的擴(kuò)展類
- 在Scala中定義無參數(shù)方法
- 學(xué)習(xí)Scala的二維布局庫和抽象類
- Scala學(xué)習(xí):叫名參數(shù)by-name parameter
分享標(biāo)題:Scala學(xué)習(xí):調(diào)用超類構(gòu)造器和override修飾符的使用
當(dāng)前地址:http://www.dlmjj.cn/article/cdocghe.html


咨詢
建站咨詢
