鍍金池/ 教程/ Scala/ 組合和繼承–實(shí)現(xiàn)類(lèi) Element 的 above,beside 和 toString()方法
包對(duì)象
Ordered Trait
組合和繼承–定義 final 成員
基本數(shù)據(jù)類(lèi)型
Match 表達(dá)式
類(lèi)和對(duì)象 (三)
操作基本數(shù)據(jù)類(lèi)型
for 表達(dá)式
組合和繼承–重載成員函數(shù)和方法
類(lèi)和對(duì)象 (二)
組合和繼承–定義 factory 對(duì)象
組合和繼承–多態(tài)和動(dòng)態(tài)綁定
Trait 的基本概念
if 表達(dá)式
組合和繼承–抽象類(lèi)
函數(shù)–函數(shù)字面量的一些簡(jiǎn)化寫(xiě)法
while 循環(huán)
組合和繼承–使用組合還是繼承?
訪問(wèn)控制修飾符
Trait 示例–Rectangular 對(duì)象
組合和繼承–定義參數(shù)化成員變量
組合和繼承–定義無(wú)參數(shù)方法
類(lèi)和對(duì)象 (一)
函數(shù)–閉包
函數(shù)–類(lèi)成員函數(shù)
Scala 基本數(shù)據(jù)類(lèi)型的實(shí)現(xiàn)方法
try 表達(dá)式處理異常
選擇瘦接口還是胖接口設(shè)計(jì)?
組合和繼承–小結(jié)
創(chuàng)建新的控制結(jié)構(gòu)
使用 import
為訪問(wèn)控制修飾符添加作用域
Scala 的類(lèi)層次關(guān)系
類(lèi)和對(duì)象 (五)
傳名參數(shù)
柯里化函數(shù)
函數(shù)–頭等公民
組合和組合和繼承–定義 heighten 和 widen 函數(shù)
使用 Package–將代碼放入包中
隱含的 import
所有類(lèi)的公共子類(lèi)–底層類(lèi)型
進(jìn)一步 Scala
函數(shù)–局部函數(shù)
引用包中的代碼
組合和繼承–使用 override 修飾符
組合和繼承–實(shí)現(xiàn)類(lèi) Element 的 above,beside 和 toString()方法
類(lèi)和對(duì)象 (四)
函數(shù)–尾遞歸
沒(méi)有“break”和“continue”的日子
組合和繼承–調(diào)用基類(lèi)構(gòu)造函數(shù)
減低代碼重復(fù)
函數(shù)–函數(shù)–可變參數(shù),命名參數(shù),缺省參數(shù)
起步 Scala
組合和繼承–擴(kuò)展類(lèi)
函數(shù)–部分應(yīng)用的函數(shù)
開(kāi)始神奇的 Scala編程之旅
組合和繼承–概述
Trait 用來(lái)實(shí)現(xiàn)可疊加的修改操作

組合和繼承–實(shí)現(xiàn)類(lèi) Element 的 above,beside 和 toString()方法

我們接著實(shí)現(xiàn)類(lèi) Element 的其它方法,如 above, beside 和 toString 方法。

above 方法,意味著把一個(gè)布局元素放在另外一個(gè)布局元素的上方,也就是把這兩個(gè)元素的 contents 的內(nèi)容連接起來(lái)。我們首先實(shí)現(xiàn) above 函數(shù)的第一個(gè)版本:

def above(that: Element) :Element =
    new ArrayElement(this.contents ++ that.contents)

Scala 中 Array 使用 Java Array 來(lái)實(shí)現(xiàn),但添加很多其它方法,尤其是 Scala 中 Array 可以轉(zhuǎn)換為 scala.Seq 類(lèi)的實(shí)例對(duì)象,scala.Seq 為一個(gè)序列結(jié)構(gòu)并提供了許多方法來(lái)訪問(wèn)和轉(zhuǎn)換這個(gè)序列。

實(shí)際上上面 above 的實(shí)現(xiàn)不是十分有效,因?yàn)樗辉试S你把不同長(zhǎng)度的布局元素疊加到另外一個(gè)布局元素上面,但就目前來(lái)說(shuō),我們還是暫時(shí)使用這個(gè)實(shí)現(xiàn),只使用同樣長(zhǎng)度的布局元素,后面再提供這個(gè)版本的增強(qiáng)版本。

下面我們?cè)賹?shí)現(xiàn)類(lèi) Element 的另外一個(gè) beside 方法,把兩個(gè)布局元素并排放置,和前面一樣,為簡(jiǎn)單起見(jiàn),我們暫時(shí)只考慮相同高度的兩個(gè)布局元素:

def beside(that: Element) :Element = {
    val contents = new Array[String](this.contents.length)
    for(i <- 0 until this.contents.length)
      contents(i)=this.contents(i) + that.contents(i)
    new ArrayElement(contents)
  }

盡管上面的實(shí)現(xiàn)滿(mǎn)足 beside 要求,但采用的還是指令式編程,我們使用函數(shù)說(shuō)編程可以實(shí)現(xiàn)下面簡(jiǎn)化代碼:

def beside(that: Element) :Element = {
    new ArrayElement(
      for(
        (line1,line2) <- this.contents zip that.contents
      ) yield line1+line2
    )
  } 

這里我們使用了 Array 的 zip 操作符,可以用來(lái)將兩個(gè)數(shù)組轉(zhuǎn)換成二元組的數(shù)組,zip 分別取兩個(gè)數(shù)組對(duì)應(yīng)的元素組成一個(gè)新的二元祖,比如:

scala> Array( 1,2,3) zip Array("a","b")
res0: Array[(Int, String)] = Array((1,a), (2,b))

如果一個(gè)數(shù)組長(zhǎng)度大于另外一個(gè)數(shù)組,多余的元素被忽略。 for 的 yield 部分用來(lái)構(gòu)成一個(gè)新元素。

最后我們實(shí)現(xiàn) Element 的 toString 方法用來(lái)顯示布局元素的內(nèi)容:

override def toString = contents mkString "\n"

這里使用 mkString 函數(shù),這個(gè)函數(shù)可以應(yīng)用到任何序列數(shù)據(jù)結(jié)構(gòu)(包括數(shù)組),也就是把 contents 的每個(gè)元素調(diào)用 toString,然后使用“\n”分隔。