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

组合与继承之扩展类

时间:2015-08-18 01:24:36      阅读:157      评论:0      收藏:0      [点我收藏+]

标签:

接上篇blog,为了实例化一个元素,我们需要创建一个扩展了Element类并实现抽象的contents方法的子类。可能的方式之一:

class ArrayElement(conts: Array[String]) extends Elements {
    def contents: Array[String] = conts
}

ArrayElement类的定义扩展了Element,与java类似,在类名之后使用extends子句表示。这样的extends子句有两个效果:使得ArrayElement类继承Elements的所有非私有的成员(方法与属性,确定属性可以被继承,这与java不同,并且让ArrayElement类型成为Elements类型的子类型。

如果你省略了extends子句,Scala编译器将隐式地假设你的类扩展自scala.AnyRef,这与java平台上的java.lang.Objects相同。因此,Element类隐式地扩展了AnyRef类。

继承表示超类的所有成员也是子类的成员,但以下两种情况例外:第一,超类的私有成员不会被子类继承。第二,超类中的成员若与子类中实现的成员具有相同名称和参数则不会被子类继承。这种情况被称为子类的成员重写(override)了超类的成员。如果子类中的成员是具体的而超类中的是抽象的,我们也可以说具体的成员实现了抽象的成员

例如,ArrayElement类的contents方法重写了Elements类的抽象方法contents。相应地,ArrayElement类从Element类继承了width和height方法。

子类型化是指子类的值可以在任何需要其超类的值的地方使用。例如:

val e: Element = new ArrayElement(Array("hello"))

变量e被定义为Element类型,所以其初始化的值也应当是Element。但实际上初始化值的类型是ArrayElement。可以这样写的原因是ArrayElement类扩展了Element类,所以ArrayElement类型与Element类型是兼容的。

组合与继承之扩展类

标签:

原文地址:http://my.oschina.net/fhd/blog/493728

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!