日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Scala程序中的擴展類

我們?nèi)匀恍枰軌騽?chuàng)建新的元素對象。你已經(jīng)看到了因為類Element是抽象的,所以“new Element”不能被用來做這件事。因此,為了實例化一個元素,我們需要創(chuàng)建擴展了Element并實現(xiàn)抽象的contents方法的子類。代碼10.3展示了一種可能的方式:

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

代碼 10.3 定義ArrayElement為Element的子類

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

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

 
 
 
 
  1. ... extends Element ...

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

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

圖釋 10.1 ArrayElement的類關(guān)系圖

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

例如,ArrayElement的contents方法重載(或者可說成:實現(xiàn))了類Element的抽象方法contents。這個設(shè)計的一個漏洞是因為返回數(shù)組是可變的,所以客戶端能改變它。本書中我們希望事情盡量簡化,但當ArrayElement是真實項目中的部分時,你應(yīng)當考慮代之以返回一個數(shù)組的防御性拷貝。另一個問題是我們現(xiàn)在并不確信contents數(shù)組所有的String元素具有同樣的長度。這可以通過在主構(gòu)造器中檢查前提條件,并且一旦違反則拋出異常的方式來解決。相對的,類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,所以其初始化的值也應(yīng)當是Element。實際上,初始化值的類型是ArrayElement。這也沒問題,因為類ArrayElement擴展了類Element,并且因此,類型ArrayElement適用于類型Element。
想了解更多子類和子類型之間的差異,參見詞匯表中的subtype。

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

【相關(guān)閱讀】

  1. 在Scala中定義無參數(shù)方法
  2. 學(xué)習(xí)Scala的二維布局庫和抽象類
  3. Scala學(xué)習(xí):叫名參數(shù)by-name parameter
  4. Scala:如何編寫新的控制結(jié)構(gòu)
  5. Scala學(xué)習(xí):Curry化的函數(shù)

當前標題:Scala程序中的擴展類
分享網(wǎng)址:http://m.5511xx.com/article/dhcsssd.html