
138 第
5
章
overriding functions
如何覆盖方法
你可以使用与覆盖属性相类似的方式覆盖方法:在子类中添加该
方法以及override前缀。
在本例中,我们希望在Hippo子类中覆盖makeNoise和eat方法,
以便它们可以执行Hippo特有操作。代码如下:
class Hippo : Animal() {
override val image = "hippo.jpg"
override val food = "grass"
override val habitat = "water"
override fun makeNoise() {
println("Grunt! Grunt!")
}
override fun eat() {
println("The Hippo is eating $food")
}
}
覆盖方法的规则
覆盖方法时,你必须遵守如下两大规则:
子类中的方法参数必须与父类中的一致
。
例如,父类中的某个方法有三个Int类型的参数,那么子类中覆盖
的方法也必须有三个Int参数,否则代码将无法通过编译。
¥
方法的返回类型必须是兼容的
。
无论父类方法定义了什么返回类型,覆盖的方法必须返回相同的类
型,或是其子类型。子类型只会做任何父类定义的事情,因此返回一
个父类预期的子类是安全的。
¥
在以上Hippo代码中,我们覆盖的方法没有参数和返回值。这与父
类中定义的方法相一致,它们遵守了覆盖方法的规则。
Animal
image
food
habitat
hunger
makeNoise() ...