继承是类独有的,结构体和枚举类都不具有这个功能。
继承就好像子承父业一样,一个继承的类(称为子类subClass)可以获得被继承的类(称为父类superClass)的属性,方法和其他特性。
子类可以重写父类的方法,也可以添加自己的属性,还可以为继承而来的属性添加观察器(对继承而来的存储和计算属性都可以)
基类
一个不继承自任何类的类称为基类。在Swift中,是没有共同的终极父类的。oc和java都是有终级父类的。下面定义一个Animal基类。
class Animal {
var life : Int = 0
var description: String{
return "An animal with a life of \(life)"
}
func makeSounds() {
}
}
继承语法
<span style="color:#ff0000;">class Dog: Animal</span> {
var name : String = "larry"
}
上面的Dog类继承自Animal类,并且添加了自己的name属性。我们可以修改一下dog继承的属性,然后打印一下
var dog = Dog()
dog.life = 10
print("dog's life is",dog.life) //dog's life is 10
覆盖(override)父类属性
对于继承而来的存储属性或者计算属性,我们可以通过重写这个属性的getter和setter方法来实现覆盖。下面是几条规则:
1、当你重写了setter方法的时候,一定要重写getter方法。但是可以只重写getter方法。
2、覆盖属性的时候,属性名和类型都必须和继承的属性一致才算覆盖。并且前面要加上override关键字。
3、你可以将继承的只读属性重写为读写属性,但是不能将继承的读写属性重写为只读属性。
下面重写Animal的description属性
class Dog: Animal {
var name : String = "larry"
override var description: String {
get{
return "It's a dog with the name of \(name)"
}
}
}
覆盖属性观察器
规则:
1、不能对继承的常量,或者只读属性添加属性观察器
2、不能同时对一个继承属性同时添加属性观察器和setter方法。因为setter方法已经可以提供属性观察器的功能。
3、即使覆盖了之后,如果父类的该属性有观察器,那么当值修改的时候,父类的观察器也会被调用。
class Dog: Animal {
var name : String = "larry"
override var life: Int {
didSet{
print("The dog's life is \(life)")
}
}
override var description: String {
get{
return "It's a dog with the name of \(name)"
}
}
}
覆盖父类方法
同样的,加上override后,重写父类方法就可以
override func makeSounds() {
print("wang! wang!")
}
防止覆盖
使用final关键字去修饰就可以了。比如final var
,
final func,
final class func,
final subscript