国产chinesehdxxxx野外,国产av无码专区亚洲av琪琪,播放男人添女人下边视频,成人国产精品一区二区免费看,chinese丰满人妻videos

Scala 組合和繼承–多態(tài)和動態(tài)綁定

2018-09-28 18:23 更新

組合和繼承–多態(tài)和動態(tài)綁定

在前面的例子我們看到類型為 Element 的變量可以保存 ArrayElement 類型的對象,這種現(xiàn)象稱為“多態(tài)”。也就是基類類型的變量可以保存其子類類型的對象,到目前為止我們定義了兩個 Element 的子類,ArrayElement 和 LineElement。你還可以定義其它子類,比如:

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

結(jié)合前面定義的類定義,我們就有了如下圖所示的類層次關(guān)系:

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)

若你檢查繼承層次關(guān)系,你會發(fā)現(xiàn)這四個 val 定義的每一個表達式,等號右側(cè)表達式的類型都在將被初始化的等號左側(cè)的 val 類型的層次之下。

另一方面,如果調(diào)用變量(對象)的方法或成員變量,這個過程是一個動態(tài)綁定的過程,也就是說調(diào)用哪個類型的方法取決于運行時變量當前的類型,而不是定義變量的類型。

為了顯示這種行為,我們在 Element 中添加一個 demo 方法,定義如下:

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

如果你使用交互式 Scala 解釋器來測試,你可以定義如下的方法:

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

下面我們分別使用 ArrayElement,LineElement 和 UniformElement 來調(diào)用這個方法:

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

可以看到由于 ArrayElement 和 LineElement 重載了 Element 的 demo 方法,因此調(diào)用 invokeDemo 時由于“動態(tài)綁定”因此會調(diào)用這些子類的 demo 方法,而由于 UniformElement 沒有重載 Element 的 demo 方法,動態(tài)綁定時也會調(diào)用 UniformElement 的 demo 方法(但此時實際為基類的 demo 方法)。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號