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

組合和組合和繼承–定義 heighten 和 widen 函數(shù)

我們還需要最后一個(gè)改進(jìn),之前的 Element 實(shí)現(xiàn)不夠完善,只支持同樣高度和同樣寬度的 Element 使用 above 和 beside 函數(shù),比如下面的代碼將無法正常工作,因?yàn)榻M合元素的第二行比第一行要長(zhǎng):

new ArrayElement(Array("hello")) above 
new ArrayElement(Array("world!"))

與之相似的,下面的表達(dá)式也不能正常工作,因?yàn)榈谝粋€(gè) ArrayElement 高度為二,而第二個(gè)的高度只是一

new ArrayElement(Array("one", "two")) beside 
new ArrayElement(Array("one"))

下面代碼展示了一個(gè)私有幫助方法,widen,能夠帶個(gè)寬度做參數(shù)并返回那個(gè)寬度的 Element。結(jié)果包含了這個(gè) Element 的內(nèi)容,居中,左側(cè)和右側(cè)留需帶的空格以獲得需要的寬度。這段代碼還展示了一個(gè)類似的方法,heighten,能在豎直方向執(zhí)行同樣的功能。widen 方法被 above 調(diào)用以確保 Element 堆疊在一起有同樣的寬度。類似的,heighten 方法被 beside 調(diào)用以確??吭谝黄鸬脑鼐哂型瑯拥母叨?。有了這些改變,布局庫函數(shù)可以使用了

abstract class Element {
  def contents: Array[String]
  def height: Int = contents.length
  def width: Int = if (height == 0) 0 else contents(0).length
  def above(that: Element) :Element =
    Element.elem(this.contents ++ that.contents)
  def beside(that: Element) :Element = {
    Element.elem(
      for( 
        (line1,line2) <- this.contents zip that.contents
      ) yield line1+line2
    ) 
  }
  def widen(w: Int): Element =
  if (w <= width) this
  else {
    val left = Element.elem(' ', (w - width) / 2, height)
        var right = Element.elem(' ', w - width - left.width, height)
        left beside this beside right
  } 
def heighten(h: Int): Element =
  if (h <= height) this  
  else {  
    val top = Element.elem(' ', width, (h - height) / 2)
        var bot = Element.elem(' ', width, h - height - top.height)
        top above this above bot
  }  
  override def toString = contents mkString "\n"\
}