首页 > 其他 > 详细

组合与继承之多态和动态绑定

时间:2015-08-20 13:27:56      阅读:183      评论:0      收藏:0      [点我收藏+]

前面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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!