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

Scala程序中如何實現多態和動態綁定

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

在10.4節中你看到了類型Element的變量可以指向類型ArrayElement的對象。這種現象的名字叫多態:polymorphism,是指“許多形狀”或“許多形式”的意思。這種情況下,Element對象可以有許多形式。這種類型的多態被稱為子類型化多態:subtyping polymorphism。Scala里另一種類型的多態,稱為統一多態:universal polymorphism,將在第19章討論。目前為止,你已經看到了兩種形式:ArrayElement和LineElement。你可以通過定義新的Element子類創造Element的更多形式。例如,下面定義了擁有給定長度和高度并被指定字符充滿的新的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 布局元素的類層級

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

類Element的繼承層級現在看上去如圖釋10.3展示的樣子。結果,Scala將接受所有的下列賦值,因為賦值表達式的類型符合定義的變量類型:

  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'23)  
若你檢查繼承層級,你會發現這四個val定義的每一個里,等號右側表達式的類型都在將被初始化的等號左側的val類型之下。

然而,另一半的故事是,變量和表達式上的方法調用是動態綁定:dynamically bound的。這意味著被調用的實際方法實現取決于運行期對象基于的類,而不是變量或表達式的類型。為了演示這種行為,我們會從我們的Element類中臨時移除所有存在的成員并添加一個名為demo的方法。我們會在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  
如果你把這些代碼輸入到了解釋器中,那么你就能定義這個帶了一個Element并調用demo的方法:

  1. def invokeDemo(e: Element) {  
  2.  e.demo()  
  3. }  
如果你傳給invokeDemo一個ArrayElement,你會看到一條消息指明ArrayElement的demo實現被調用,盡管被調用demo的變量e的類型是Element:

  1. scala> invokeDemo(new ArrayElement)  
  2. ArrayElement's implementation invoked  
相同的,如果你傳遞LineElement給invokeDemo,你會看到一條指明LineElement的demo實現被調用的消息:

  1. scala> invokeDemo(new LineElement)  
  2. LineElement's implementation invoked  
傳遞UniformElement時的行為一眼看上去會有些可以,但是正確:

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

因為UniformElement沒有重載demo,它從它的超類Element繼承了demo的實現。因此,當對象的類是UniformElement時,Element的實現就是要調用的demo的正確實現。

【相關閱讀】

  1. Scala學習:調用超類構造器和override修飾符的使用
  2. Scala:重載方法和字段及定義參數化字段
  3. Scala程序中的擴展類
  4. 在Scala中定義無參數方法
  5. 學習Scala的二維布局庫和抽象類

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

2011-08-22 09:34:50

Objective-C多態動態類型

2023-10-20 09:51:00

編程開發

2014-12-29 10:19:01

Java

2009-07-20 18:03:26

Scala程序Singleton對象

2009-07-22 09:08:09

Scalaabove方法

2009-07-22 07:53:00

Scala擴展類

2009-07-22 09:27:04

Scala變高變寬

2021-12-12 20:10:49

域名動態IP

2011-04-12 10:40:04

C++多態

2009-07-22 09:43:30

Scala類型

2009-07-21 07:30:00

Scala程序Application

2012-07-25 14:25:08

PrismPrism4MVVM

2012-01-09 11:26:15

Java

2021-06-30 10:32:33

反射多態Java

2020-08-20 08:23:52

VueDOM運算符

2010-09-14 09:30:04

Java多態

2010-03-05 16:56:42

Python綁定C++

2017-10-27 22:03:35

javascrip

2009-07-21 14:03:00

Scalaif表達式while循環

2020-06-19 12:59:33

動態腳本Java
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产精品1区2区 | 国产精品一区二区三区四区 | 一区日韩 | 欧美日一区二区 | 欧美xxxx网站| 美日韩免费视频 | 99pao成人国产永久免费视频 | 国产成人艳妇aa视频在线 | 日本午夜网站 | 91网站视频在线观看 | 国产欧美在线一区二区 | 精品网| 日本手机在线 | 成人免费视频在线观看 | av黄色在线 | 黄频视频 | 午夜爱爱毛片xxxx视频免费看 | 欧美专区在线视频 | 免费久久久| 国产精品免费观看视频 | 欧美日本在线观看 | 精品影视| 欧美在线一区视频 | 国产精品久久久久久久久久三级 | 中文字幕高清在线 | 精品久久香蕉国产线看观看亚洲 | 国产成人精品一区二区三区网站观看 | 欧美一区二区三区,视频 | 精品国产一区二区久久 | 欧美精品一区久久 | 亚洲国产一区二区在线 | 国产一区中文字幕 | 久久久www成人免费无遮挡大片 | 亚洲成人在线视频播放 | 成人国产精品久久 | 欧美一区二区三区在线观看视频 | 一区二区久久电影 | 免费看一区二区三区 | 五月婷婷在线视频 | 亚洲经典一区 | 国产性网 |