
136 第
5
章
overriding properties
如何(以及何时)覆盖属性
通过将属性添加到子类,并使用override关键字作为前缀,可以
覆盖从父类继承的属性。
在本例中,我们希望覆盖Hipoo类从Animal父类继承的image、
food和habitat属性,以便它们被初始化为Hippo特有的值。代
码如下:
class Hippo : Animal() {
override val image = "hippo.jpg"
override val food = "grass"
override val habitat = "water"
}
我们覆盖了三个属性,以便使用与父类不同的值初始化它们。这
是因为在Animal父类中,每个属性都使用val关键字进行定义。
如你所了解到的,子类在继承的时候,必须调用父类构造函数;
这样它可以运行其初始化代码,包括创建属性并初始化它们。这
意味着,如果在父类中使用val定义属性
,
你必须通过在子类中
覆盖它来指定不同的值
。
如果使用var定义父类属性,则不需要为了指定新的值而覆盖它,
因为var变量可以重用于其他值。你可以在子类的初始化程序块中
为它赋新值,如下例所示:
open class Animal {
var image = ""
...
}
class Hippo : Animal() {
init {
image = "hippo.jpg"
}
...
}
Animal
image
food
habitat
hunger
Hippo
image
food