标签:
前面blog中,你可以看到Element类型的变量可以指向ArrayElement类型的对象。这种现象叫做多态。这种情况下,Element对象可以有许多形式(这种类型的多态被称为子类型化多态:subtyping polymorphism,scala里另一种类型的多态,称为统一多态:universal polymorphism,这个后面blog会讲到)。目前为止,你已经看到了两种形式:ArrayElement和LineElement。你可以通过定义新的Element子类创造Element的更多形式。
看看下面的代码:
object T4 {
def main(args: Array[String]): Unit = {
val e1: Elements = new ArrayElement(Array("hello", "world"))
val ae: ArrayElement = new LineElement("hello")
val e2: Elements = ae
}
}
检查继承层级会发现以上每一个val的定义里,等号右侧表达式的类型都在等号左侧被初始化的val类型之下。
然而,另一方面,变量和表达式上的方法调用是动态绑定(dynameically bound)的。这意味着被调用的实际方法实现取决于运行期对象基于的类,而不是变量或表达式的类型(也就是说不是基于声明的类型,而是实例化的类型)。示例:
object T5 {
def main(args: Array[String]): Unit = {
val p = new Parent
val c = new Child
println(p.result) //parent class
println(c.result) //child class
}
}
class Parent {
def result = "parent class"
}
class Child extends Parent {
override def result = "child class"
}
标签:
原文地址:http://my.oschina.net/fhd/blog/494950