标签:
前面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