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

Scala程序中的擴展類

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

我們仍然需要能夠創建新的元素對象。你已經看到了因為類Element是抽象的,所以“new Element”不能被用來做這件事。因此,為了實例化一個元素,我們需要創建擴展了Element并實現抽象的contents方法的子類。代碼10.3展示了一種可能的方式:

  1. class ArrayElement(conts: Array[String]) extends Element {  
  2.  def contents: Array[String] = conts  
  3. }  

代碼 10.3 定義ArrayElement為Element的子類

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

類ArrayElement定義為擴展了類Element。就好象Java里,你在類名之后使用extends子句那樣:

  1. ... extends Element ... 
這種extends子句有兩個效果:使類ArrayElement從類Element繼承所有非私有的成員,并且使ArrayElement成為Element的子類型。由于ArrayElement擴展了Element,類ArrayElement被稱為類Element的子類。反過來,Element是ArrayElement的超類。

如果你省略extends子句,Scala編譯器隱式地假設你的類擴展自scala.AnyRef,在Java平臺上與java.lang.Object一致。因此,類Element隱式地擴展了類AnyRef。你可以在圖釋10.1上看到這些繼承關系。

 ArrayElement的類關系圖

圖釋 10.1 ArrayElement的類關系圖

繼承:inheritance表示超類的所有成員也是子類的成員,除了以下兩點。首先,超類的私有成員不被子類繼承。其次,在子類中實現的與超類中的成員具有相同名稱和參數的將不被繼承到子類中。這種情況我們說子類的成員重載:override了超類的成員。如果子類中的成員是具體的而超類中的是抽象的,我們還可以說具體的成員實現:implement了抽象的。

例如,ArrayElement的contents方法重載(或者可說成:實現)了類Element的抽象方法contents。這個設計的一個漏洞是因為返回數組是可變的,所以客戶端能改變它。本書中我們希望事情盡量簡化,但當ArrayElement是真實項目中的部分時,你應當考慮代之以返回一個數組的防御性拷貝。另一個問題是我們現在并不確信contents數組所有的String元素具有同樣的長度。這可以通過在主構造器中檢查前提條件,并且一旦違反則拋出異常的方式來解決。相對的,類ArrayElement從類Element繼承了width和height方法。例如,給定ArrayElement的一個對象ae,你可以使用ae.width查詢其長度,就好象width是定義在類ArrayElement中一樣:

  1. scala> val ae = new ArrayElement(Array("hello""world"))  
  2. ae: ArrayElement = ArrayElement@d94e60 
  3. scala> ae.width  
  4. res1: Int = 5 
子類型化:subtyping是指子類的值可以被用在需要其超類的值的任何地方。例如:

  1. val e: Element = new ArrayElement(Array("hello")) 
變量e被定義為類型Element,所以其初始化的值也應當是Element。實際上,初始化值的類型是ArrayElement。這也沒問題,因為類ArrayElement擴展了類Element,并且因此,類型ArrayElement適用于類型Element。想了解更多子類和子類型之間的差異,參見詞匯表中的subtype。

圖釋10.1還展示了存在于ArrayElement和Array[String]之間的組合:composition關系。這種關系被稱為組合的原因是由于類ArrayElement是被Array[String]“組合”出來的。因此Scala編譯器將在它為ArrayElement產生的二進制類中安置一個字段用來保留傳入的conts數組的引用。我們將在本章后續內容中討論一些關于組合和繼承的設計理念,詳見10.11節。

【相關閱讀】

  1. 在Scala中定義無參數方法
  2. 學習Scala的二維布局庫和抽象類
  3. Scala學習:叫名參數by-name parameter
  4. Scala:如何編寫新的控制結構
  5. Scala學習:Curry化的函數

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

2009-07-08 15:35:18

Case類Scala

2009-09-28 11:37:03

Journal.scaKestrel

2009-07-21 11:25:03

ScalaRational類

2009-07-20 18:03:26

Scala程序Singleton對象

2009-06-16 17:54:38

Scala類語法語義

2009-07-22 09:31:59

Scala類類層級Java類

2009-09-09 11:37:08

Scala的模式匹配

2009-07-22 08:52:05

Scala動態綁定

2009-07-21 08:54:35

Scala富包裝器

2009-07-21 07:30:00

Scala程序Application

2009-07-20 16:56:51

Scala類的定義

2009-09-22 10:15:42

PersistentQScala

2009-07-22 07:45:00

Scala代碼重復

2009-09-22 09:59:40

QueueCollecScala

2009-07-22 09:29:44

ScalaSpiral程序

2009-07-21 17:29:25

Scala第一類函數

2023-06-12 15:33:52

Scalafor循環語句

2009-07-08 12:43:59

Scala ServlScala語言

2009-07-21 17:21:57

Scala定義函數

2009-09-28 11:25:17

PersistentQKestrelScala
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 在线黄 | 欧美激情国产日韩精品一区18 | 久久久亚洲精品视频 | 国产精品中文字幕在线 | 日韩免费毛片 | 天天躁日日躁狠狠很躁 | 一级美国黄色片 | 国产在线观看免费 | 一级黄色片日本 | 欧美黑人一区二区三区 | 盗摄精品av一区二区三区 | 就操在线 | www.日韩免费 | 日韩精品一区二区在线观看 | 欧美精品国产精品 | 国产日韩一区二区三区 | 欧美二区在线 | 激情视频中文字幕 | 亚洲精品天堂 | 伊人久久在线观看 | 在线精品一区二区三区 | 日本韩国欧美在线观看 | 男女羞羞视频免费 | 免费精品一区 | 国产精品国产成人国产三级 | 91亚洲欧美 | 日本久久精品视频 | 色视频在线播放 | 成人一区二| 日韩电影免费在线观看中文字幕 | 欧美久久一级特黄毛片 | 国产精品中文字幕在线观看 | 亚洲一区二区久久 | 一区二区三区视频在线观看 | 欧美欧美欧美 | 亚洲精品日韩综合观看成人91 | 久久久久久看片 | 69av网| 欧美一区二区三区精品 | 国产精品精品视频一区二区三区 | 久久精品中文字幕 |