中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Scala程序中怎么實現多態和動態綁定

發布時間:2021-07-15 09:45:37 來源:億速云 閱讀:204 作者:chen 欄目:編程語言

本篇內容主要講解“Scala程序中怎么實現多態和動態綁定”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Scala程序中怎么實現多態和動態綁定”吧!

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

class UniformElement(   ch: Char,   override val width: Int,   override val height: Int  ) extends Element {   private val line = ch.toString * width   def contents = Array.make(height, line)  }

Scala程序中怎么實現多態和動態綁定

圖釋 10.3 布局元素的類層級

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

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

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

若你檢查繼承層級,你會發現這四個val定義的每一個里,等號右側表達式的類型都在將被初始化的等號左側的val類型之下。

然而,另一半的故事是,變量和表達式上的方法調用是動態綁定:dynamically bound的。這意味著被調用的實際方法實現取決于運行期對象基于的類,而不是變量或表達式的類型。為了演示這種行為,我們會從我們的Element類中臨時移除所有存在的成員并添加一個名為demo的方法。我們會在ArrayElement和LineElement中重載demo,但UniformElement除外:

abstract class Element {   def demo() {    println("Element's implementation invoked")   }  }  class ArrayElement extends Element {   override def demo() {    println("ArrayElement's implementation invoked")   }  }  class LineElement extends ArrayElement {   override def demo() {    println("LineElement's implementation invoked")   }  }  // UniformElement inherits Element’s demo  class UniformElement extends Element

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

def invokeDemo(e: Element) {   e.demo()  }

如果你傳給invokeDemo一個ArrayElement,你會看到一條消息指明ArrayElement的demo實現被調用,盡管被調用demo的變量e的類型是Element:

scala> invokeDemo(new ArrayElement)  ArrayElement's implementation invoked

相同的,如果你傳遞LineElement給invokeDemo,你會看到一條指明LineElement的demo實現被調用的消息:

scala> invokeDemo(new LineElement)  LineElement's implementation invoked

傳遞UniformElement時的行為一眼看上去會有些可以,但是正確:

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

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

到此,相信大家對“Scala程序中怎么實現多態和動態綁定”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

鄂尔多斯市| 辰溪县| 靖宇县| 舟曲县| 凯里市| 建阳市| 宜君县| 宝山区| 沾化县| 濮阳县| 彩票| 宜阳县| 黄骅市| 溆浦县| 永登县| 潜江市| 迁安市| 浙江省| 黑水县| 金秀| 临西县| 漳浦县| 江山市| 长寿区| 大理市| 盐边县| 鄄城县| 寻乌县| 清河县| 肃南| 广饶县| 正蓝旗| 喀喇| 德昌县| 长兴县| 固安县| 仁布县| 松滋市| 逊克县| 钟山县| 武宁县|