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

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

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
Scala程序中如何實(shí)現(xiàn)多態(tài)和動(dòng)態(tài)綁定

在10.4節(jié)中你看到了類(lèi)型Element的變量可以指向類(lèi)型ArrayElement的對(duì)象。這種現(xiàn)象的名字叫多態(tài):polymorphism,是指“許多形狀”或“許多形式”的意思。這種情況下,Element對(duì)象可以有許多形式。這種類(lèi)型的多態(tài)被稱(chēng)為子類(lèi)型化多態(tài):subtyping polymorphism。Scala里另一種類(lèi)型的多態(tài),稱(chēng)為統(tǒng)一多態(tài):universal polymorphism,將在第19章討論。目前為止,你已經(jīng)看到了兩種形式:ArrayElement和LineElement。你可以通過(guò)定義新的Element子類(lèi)創(chuàng)造Element的更多形式。例如,下面定義了擁有給定長(zhǎng)度和高度并被指定字符充滿(mǎn)的新的Element形式:

 
 
 
 
  1. class UniformElement(  
  2.  ch: Char,  
  3.  override val width: Int,  
  4.  override val height: Int  
  5. ) extends Element {  
  6.  private val line = ch.toString * width  
  7.  def contents = Array.make(height, line)  
  8. }  

圖釋 10.3 布局元素的類(lèi)層級(jí)

編輯推薦:Scala編程語(yǔ)言專(zhuān)題

類(lèi)Element的繼承層級(jí)現(xiàn)在看上去如圖釋10.3展示的樣子。結(jié)果,Scala將接受所有的下列賦值,因?yàn)橘x值表達(dá)式的類(lèi)型符合定義的變量類(lèi)型:

 
 
 
 
  1. val e1: Element = new ArrayElement(Array("hello", "world"))  
  2. val ae: ArrayElement = new LineElement("hello")  
  3. val e2: Element = ae  
  4. val e3: Element = new UniformElement('x', 2, 3)  

若你檢查繼承層級(jí),你會(huì)發(fā)現(xiàn)這四個(gè)val定義的每一個(gè)里,等號(hào)右側(cè)表達(dá)式的類(lèi)型都在將被初始化的等號(hào)左側(cè)的val類(lèi)型之下。

然而,另一半的故事是,變量和表達(dá)式上的方法調(diào)用是動(dòng)態(tài)綁定:dynamically bound的。這意味著被調(diào)用的實(shí)際方法實(shí)現(xiàn)取決于運(yùn)行期對(duì)象基于的類(lèi),而不是變量或表達(dá)式的類(lèi)型。為了演示這種行為,我們會(huì)從我們的Element類(lèi)中臨時(shí)移除所有存在的成員并添加一個(gè)名為demo的方法。我們會(huì)在ArrayElement和LineElement中重載demo,但UniformElement除外:

 
 
 
 
  1. abstract class Element {  
  2.  def demo() {  
  3.   println("Element's implementation invoked")  
  4.  }  
  5. }  
  6. class ArrayElement extends Element {  
  7.  override def demo() {  
  8.   println("ArrayElement's implementation invoked")  
  9.  }  
  10. }  
  11. class LineElement extends ArrayElement {  
  12.  override def demo() {  
  13.   println("LineElement's implementation invoked")  
  14.  }  
  15. }  
  16. // UniformElement inherits Element’s demo  
  17. class UniformElement extends Element  

如果你把這些代碼輸入到了解釋器中,那么你就能定義這個(gè)帶了一個(gè)Element并調(diào)用demo的方法:

 
 
 
 
  1. def invokeDemo(e: Element) {  
  2.  e.demo()  
  3. }  

如果你傳給invokeDemo一個(gè)ArrayElement,你會(huì)看到一條消息指明ArrayElement的demo實(shí)現(xiàn)被調(diào)用,盡管被調(diào)用demo的變量e的類(lèi)型是Element:

 
 
 
 
  1. scala> invokeDemo(new ArrayElement)  
  2. ArrayElement's implementation invoked  

相同的,如果你傳遞LineElement給invokeDemo,你會(huì)看到一條指明LineElement的demo實(shí)現(xiàn)被調(diào)用的消息:

 
 
 
 
  1. scala> invokeDemo(new LineElement)  
  2. LineElement's implementation invoked  

傳遞UniformElement時(shí)的行為一眼看上去會(huì)有些可以,但是正確:

 
 
 
 
  1. scala> invokeDemo(new UniformElement)  
  2. Element's implementation invoked  

因?yàn)閁niformElement沒(méi)有重載demo,它從它的超類(lèi)Element繼承了demo的實(shí)現(xiàn)。因此,當(dāng)對(duì)象的類(lèi)是UniformElement時(shí),Element的實(shí)現(xiàn)就是要調(diào)用的demo的正確實(shí)現(xiàn)。

【相關(guān)閱讀】

  1. Scala學(xué)習(xí):調(diào)用超類(lèi)構(gòu)造器和override修飾符的使用
  2. Scala:重載方法和字段及定義參數(shù)化字段
  3. Scala程序中的擴(kuò)展類(lèi)
  4. 在Scala中定義無(wú)參數(shù)方法
  5. 學(xué)習(xí)Scala的二維布局庫(kù)和抽象類(lèi)


本文題目:Scala程序中如何實(shí)現(xiàn)多態(tài)和動(dòng)態(tài)綁定
標(biāo)題URL:http://www.5511xx.com/article/cdcosoo.html