swift簡單總結(jié)(二十三)—— 繼承

版本記錄

版本號 時間
V1.0 2017.07.29

前言

我是swift2.0的時候開始接觸的,記得那時候還不是很穩(wěn)定,公司的項目也都是用oc做的,并不對swift很重視,我自己學(xué)了一段時間,到現(xiàn)在swift3.0+已經(jīng)出來了,自己平時也不寫,忘記的也差不多了,正好項目這段時間已經(jīng)上線了,不是很忙,我就可以每天總結(jié)一點了,希望對自己對大家有所幫助。在總結(jié)的時候我會對比oc進(jìn)行說明,有代碼的我會給出相關(guān)比對代碼。
1. swift簡單總結(jié)(一)—— 數(shù)據(jù)簡單值和類型轉(zhuǎn)換
2. swift簡單總結(jié)(二)—— 簡單值和控制流
3. swift簡單總結(jié)(三)—— 循環(huán)控制和函數(shù)
4. swift簡單總結(jié)(四)—— 函數(shù)和類
5. swift簡單總結(jié)(五)—— 枚舉和結(jié)構(gòu)體
6. swift簡單總結(jié)(六)—— 協(xié)議擴(kuò)展與泛型
7. swift簡單總結(jié)(七)—— 數(shù)據(jù)類型
8. swift簡單總結(jié)(八)—— 別名、布爾值與元組
9. swift簡單總結(jié)(九)—— 可選值和斷言
10. swift簡單總結(jié)(十)—— 運算符
11. swift簡單總結(jié)(十一)—— 字符串和字符
12. swift簡單總結(jié)(十二)—— 集合類型之?dāng)?shù)組
13. swift簡單總結(jié)(十三)—— 集合類型之字典
14. swift簡單總結(jié)(十四)—— 控制流
15. swift簡單總結(jié)(十五)—— 控制轉(zhuǎn)移語句
16. swift簡單總結(jié)(十六)—— 函數(shù)
17. swift簡單總結(jié)(十七)—— 閉包(Closures)
18. swift簡單總結(jié)(十八)—— 枚舉
19. swift簡單總結(jié)(十九)—— 類和結(jié)構(gòu)體
20. swift簡單總結(jié)(二十)—— 屬性
21. swift簡單總結(jié)(二十一)—— 方法
22. swift簡單總結(jié)(二十二)—— 下標(biāo)腳本

繼承

??繼承是面向?qū)ο缶幊痰奶攸c,OC中也有繼承,swift同樣也有繼承。類可以調(diào)用和訪問超類的方法,屬性和下標(biāo)腳本,并可重寫override這些方法??梢詾轭愔欣^承來的屬性添加屬性觀察器(property observer),這樣一來,當(dāng)屬性值改變時,類就會被通知到,可以為任何屬性添加屬性觀察器。

下面我們就從以下幾個方面闡述繼承。

  • 定義一個基類(Base class)
  • 子類生成(Subclassing)
  • 重寫(Overriding)
  • 防止重寫

定義一個基類

??不繼承其他類的類,稱為基類。在swift中的類并不是從一個通用的基類繼承而來,如果你不為你定義的類指定一個超類的話,這個類就自動成為基類。

看下面代碼

class Vehicle{
    var currentSpeed = 0.0
    var description : String{

    }
    func makeNoise(){

    }
}

這里,Vehicle就成為了一個基類。


子類生成

??子類生成指的是在一個已有類的基礎(chǔ)上創(chuàng)建一個新的類,子類繼承超類的特性,并且可以優(yōu)化或改變它,你還可以為子類添加新的特性。

在定義的時候,將超類名寫在子類名的后面,用冒號分割。

class Bicycle : Vehicle{
    var hasBasket  = false
}

OC一樣,子類還可以被其他類繼承,并繼承其屬性、方法等其他方面。


重寫

子類可以為繼承來的實例方法、類方法、實力屬性、或下標(biāo)腳本提供自己定制的實現(xiàn),我們把這個叫做重寫。重寫的時候就在前面加上override關(guān)鍵字。比較經(jīng)典的就是swift實例化控制器以后,如下代碼。

    override func viewDidLoad()
    {
        super.viewDidLoad()       
    }

這個是控制器實例的時候,就有重寫override這個方法。

1. 訪問超類的方法、屬性和下標(biāo)腳本

當(dāng)你的子類中重寫超類的方法、屬性或者下標(biāo)腳本時,有時你的重寫版本中使用已經(jīng)存在的超類實現(xiàn)會大有裨益。

在合適的地方,你可以通過使用super前綴來訪問超類版本的方法、屬性或下標(biāo)版本。例如:

  • 在方法someMethod的重寫實現(xiàn)中,可以通過super. someMethod ()來調(diào)用超類版本的someMethod方法。

2. 重寫方法

在子類中,你可以重寫繼承來的實例方法或類方法,提供一個定制或替代的方法實現(xiàn)。

下面看一下代碼。

class Vehicle{
    var currentSpeed = 0.0
    var description : String{
        return "traveling at \(currentSpeed) miles per hour"
    }
    
    func makeNoise() {
        print("nothing to do")
    }
}

class Train: Vehicle {
    override func makeNoise() {
        print("train")
    }
}

class JJSwiftVC: UIViewController
{
    override func viewDidLoad()
    {
        super.viewDidLoad()
        
        let train = Train()
        train.makeNoise()
    }
}

下面看一下輸出結(jié)果

train

3. 重寫屬性

你可以重寫繼承來的實例屬性和類屬性,提供自己定制的settergetter方法,或添加熟悉屬性觀察器使重寫的屬性觀察值什么時候發(fā)生改變。

4. 重寫屬性的setter和getter方法

??你可以提供定制的gettersetter來重寫任意繼承來的屬性,無論繼承來的屬性是存儲型的還是計算型的屬性,子類并不知道繼承來的屬性是存儲型的還是計算型的,它只是知道繼承來的屬性會有一個名字和類型,你在重寫一個屬性時,必須將它的名字和類型都寫出來,這樣編譯器去檢查你重寫的屬性是與超類中同名同類的屬性相匹配的。

??你可以將一個繼承來的只讀屬性重寫為一個讀寫屬性,只需要你重寫屬性里的getter和setter方法,但是,你不可以將一個繼承來的讀寫屬性重寫為一個只讀屬性。

注意:如果你在重寫屬性中提供了setter,那么你也一定要提供getter。如果你不想在重寫版本中的getter里修改繼承來的屬性值,你可以直接通過super.someProperty來返回繼承來的值,其中someProperty是你要重寫的屬性的名字。

class Vehicle{
    var currentSpeed = 0.0
    var description : String{
        return "traveling at \(currentSpeed) miles per hour"
    }
    
    func makeNoise() {
        print("nothing to do")
    }
}

class Car : Vehicle{
    var gear = 1
    override var description: String{
        return super.description + "in gear \(gear)"
    }
}

class JJSwiftVC: UIViewController
{
    override func viewDidLoad()
    {
        super.viewDidLoad()
        
        view.backgroundColor = UIColor.green
        
        let car = Car()
        car.currentSpeed = 25.0
        car.gear = 3
        print("Car : \(car.description)")
    }
}

下面看一下輸出結(jié)果

Car : traveling at 25.0 miles per hourin gear 3

5. 重寫屬性觀察器

你可以在屬性重寫中為一個繼承來的屬性添加屬性觀察器,這樣一來,當(dāng)繼承類的屬性值發(fā)生改變時,你就會被通知到。

注意:你不可以為繼承來的常量存儲型屬性或繼承來的只讀計算型屬性添加屬性觀察器,這些屬性是不可以設(shè)置的。還要注意不要同時提供重寫的setter和重寫屬性觀察器,如果你想要觀察屬性值的變化,并且你已經(jīng)為那個屬性提供了定制的setter,那么你在setter中就可以觀察到任何值變化了。

class AutomaticCar : Car{
    override var currentSpeed: Double{
        didSet{
            gear = Int(currentSpeed / 10.0) + 1
        }
    }
}

class JJSwiftVC: UIViewController
{
    override func viewDidLoad()
    {
        super.viewDidLoad()
        
        view.backgroundColor = UIColor.green
        
        let automaticCar = AutomaticCar()
        automaticCar.currentSpeed = 35.0
        print("automaticCar : \(automaticCar.description)")
    }
}

下面看結(jié)果輸出

automaticCar : traveling at 35.0 miles per hourin gear 4

防止重寫

有的時候你不希望被重寫,那么你可以通過把方法、屬性或下標(biāo)腳本標(biāo)記為final來防止它們被重寫,只需要在聲明關(guān)鍵字前加上@final特性即可。
-final var
-final func
-final class func
-final subscript

同時你也可以在關(guān)鍵字class前添加final特性(final class)來將整個類標(biāo)記為final的,這樣的類是不可以繼承的。

后記

未完,待續(xù)~~~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容