繼承是類獨有的,結構體和枚舉類都不具有這個功能。
繼承就好像子承父業一樣,一個繼承的類(稱為子類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