成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Scala學習:調用超類構造器和override修飾符的使用

開發 后端
本文節選自Martin Odersky,Lex Spoon和Bill Venners所著,Regular翻譯的《Programming in Scala》的第十章。Scala是一種針對 JVM 將函數和面向對象技術組合在一起的編程語言。

調用超類構造器

現在你有了兩個類組成的完整系統:抽象類Element,和擴展它的具體類ArrayElement?;蛟S你還在設想其它表達元素的方式。比方說,客戶或許想要創造由給定單行字串構成的布局元素。面向對象編程讓使用新數據變體擴展系統變得容易。只要加入子類即可。例如,代碼10.6展示了擴展ArrayElement的LineElement類:

  1. class LineElement(s: String) extends ArrayElement(Array(s)) {  
  2.  override def width = s.length  
  3.  override def height = 1 
  4. }  

代碼 10.6 調用超類構造器

51CTO編輯推薦:Scala編程語言專題

由于LineElement擴展了ArrayElement,并且ArrayElement的構造器帶一個參數(Array[String]),LineElement需要傳遞一個參數到它的超類的主構造器。要調用超類構造器,只要把你要傳遞的參數或參數列表放在超類名之后的括號里即可。例如,類LineElement傳遞了Array(s)到ArrayElement的主構造器,把它放在超類ArrayElement的名稱后面的括號里:

  1. ... extends ArrayElement(Array(s)) ...  
有了新的子類,布局元素的繼承級別現在看起來就像展示在圖釋10.2中的那樣了。

 LineElement的類關系圖

圖釋 10.2 LineElement的類關系圖

使用override修飾符

請注意LineElement里width和height的定義帶著override修飾符。你在6.3節中的 toString方法中看到過。Scala里所有重載了父類具體成員的成員都需要這樣的修飾符。如果成員實現的是同名的抽象成員則這個修飾符是可選的。而如果成員并未重載或實現什么其它基類里的成員則禁用這個修飾符。由于類LineElement的height和width重載了類Element的具體成員定義,override是需要的。

這條規則給編譯器提供了有用的信息來幫助避免某些難以捕捉的錯誤并使得系統的改進更加安全。例如,如果你碰巧拼錯了方法名或偶爾傳遞給它不同的參數列表,編譯器會回應錯誤信息:

  1. $ scalac LineElement.scala  
  2. .../LineElement.scala:50:  
  3. error: method hight overrides nothing  
  4. override def hight = 1 
  5. ˆ  
系統改進的時候,override公約顯得更重要。假設你定義了一個2D畫圖方法庫。你把它公開,并廣泛使用。庫的下一個版本里你想在你的基類Shape里增加一個使用以下簽名的新方法:

  1. def hidden(): Boolean 
你的新方法將被用在許多畫圖方法中去決定是否需要把形狀畫出來。這或許會產生顯著的提速,但你不可以冒著破壞客戶代碼的風險做這件事。畢竟客戶說不定已經使用不同的hidden實現定義了Shape的子類?;蛟S客戶的方法實際上是讓對象消失而不是檢測是否對象是隱藏的。因為這兩個版本的hidden互相重載,你的畫圖方法將停止對象的消失,這可真不是你想要的!這些“意外的重載”就是被稱為“脆基類”問題的最通常的表現。這個問題是指如果你添加了新的成員到類層級的基類中(通常我們稱為超類),你會有破壞客戶代碼的風險。

Scala不能完全解決脆基類問題,不過它與Java相比有所改善。Java1.5中,@Override標注被引入并與Scala的override修飾符起相同的工作,不過不像Scala的override,它不是必需的。如果畫圖庫和它的客戶是用Scala寫的,那么客戶的hidden原始實現就不會有override修飾符,因為這時候還沒有另外一個使用那個名字的方法。一旦你添加了hidden方法到你Shape類的第二個版本,客戶的重編譯將給出像下列這樣的錯誤:

  1. .../Shapes.scala:6: error: error overriding method  
  2. hidden in class Shape of type ()Boolean;  
  3. method hidden needs 'override' modifier  
  4. def hidden(): Boolean =  
  5. ˆ  

也就是說,代之以錯誤的執行,你的客戶將得到一個編譯期錯誤,這常常是更可取的。

【相關閱讀】

  1. Scala:重載方法和字段及定義參數化字段
  2. Scala程序中的擴展類
  3. 在Scala中定義無參數方法
  4. 學習Scala的二維布局庫和抽象類
  5. Scala學習:叫名參數by-name parameter

責任編輯:book05 來源: Artima
相關推薦

2009-08-24 16:49:39

C#修飾符

2009-06-19 10:51:39

Scalapackage訪問修飾符

2011-06-02 14:51:07

JAVA修飾符

2023-12-29 09:01:27

SwiftUI視圖修飾符

2009-08-27 11:16:40

C# sealed修飾

2011-05-13 14:56:14

autoregisterstatic

2009-08-27 11:04:08

C# extern修飾

2009-08-27 13:06:13

C# new修飾符

2009-09-02 17:14:28

C#修飾符

2009-08-21 13:58:06

C# virtual修

2009-08-27 11:12:03

C# abstract

2009-12-11 10:42:00

Scala講座類定義構造函數

2009-09-02 17:04:35

C# Extern修飾

2009-07-21 12:35:00

Scala從構造器

2015-08-18 09:25:11

Java修飾符關鍵詞

2009-09-04 11:06:40

C#訪問修飾符

2021-08-02 12:33:26

Swift修飾符視圖

2009-06-12 14:46:05

static修飾符Java教程

2011-06-28 09:29:11

C#修飾符

2009-06-12 13:37:47

訪問權限修飾符Java教程
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美激情一区二区三级高清视频 | 久久1区 | 欧美日韩精品综合 | 国产专区视频 | 国产一区在线视频 | 中国大陆高清aⅴ毛片 | 日韩欧美在线观看视频 | 日韩成人在线播放 | 亚洲精品在线观看网站 | av片网| 亚洲国产aⅴ成人精品无吗 欧美激情欧美激情在线五月 | 亚洲一区二区av | 人人做人人澡人人爽欧美 | yiren22综合网成人 | 在线国产视频观看 | www国产亚洲精品久久网站 | 丝袜毛片 | 国产精品久久久久久久久久久免费看 | 亚洲一区二区三区免费在线观看 | wwwxxx国产| 久久久久一区二区 | 午夜伊人| 久久久成人免费视频 | 精品国产视频 | 狠狠色网| 亚洲第一在线 | 精品国产一区二区在线 | 欧美在线 | 日本亚洲欧美 | 中文成人在线 | 国产精品不卡一区 | 国产精品免费大片 | 精品国产免费一区二区三区五区 | 午夜激情免费视频 | 7777精品伊人久久精品影视 | 91精品久久| 美女视频久久 | 免费黄色录像片 | 亚洲国产一区在线 | 中文字幕视频在线观看 | 成人精品在线观看 |