码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-08-20 13:30:27      阅读:126      评论: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
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!