亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Swift > 正文

Swift教程之繼承詳解

2020-03-09 17:51:01
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了Swift教程之繼承詳解,一個類可以從另外一個類中繼承方法,屬性或者其它的一些特性,當一個類繼承于另外一個類時,這個繼承的類叫子類,被繼承的類叫父類,需要的朋友可以參考下
 

一個類可以從另外一個類中繼承方法,屬性或者其它的一些特性。當一個類繼承于另外一個類時,這個繼承的類叫子類,被繼承的類叫父類。繼承是Swift中類區別于其它類型的一個基本特征。

Swift中的類可以調用父類的方法,使用父類的屬性和下標,還可以根據需要使用重寫方法或者屬性來重新定義和修改他們的一些特性。Swift可以幫助你檢查重寫的方法和父類的方法定義是相符的。

類還可以為它繼承的屬性添加觀察者,這樣可以能夠讓它在一個屬性變化的時候得到通知。屬性觀察者可以被添加給任何屬性,不管它之前是存儲屬性還是計算屬性。

1、定義一個基類

任何一個不繼承于其它類的類被稱作基類

注意:Swift的類不是從一個全局基類繼承而來。在你編寫代碼的時,只要是在類的定義中沒有繼承自父類的類都是基類。

下面的例子定義了一個叫Vehicle的基類。基類包含兩個所有交通工具通用的屬性numberOfWheels和maxPassengers。這兩個屬性被一個叫description的方法使用,通過返回一個String描述來作為這個交通工具的特征:

 

復制代碼代碼如下:

class Vehicle {
    var numberOfWheels: Int
    var maxPassengers: Int
    func description() -> String {
        return "/(numberOfWheels) wheels; up to /(maxPassengers) passengers"
    }
    init() {
        numberOfWheels = 0
        maxPassengers = 1
    }
}

這個交通工具類Vehicle還定義了一個構造函數來設置它的屬性。構造函數更多的解釋在Initialization一章,但是為了說明子類如何修改繼承的屬性,這里需要簡要解釋一下什么叫構造函數。

 

通過構造函數可以創建一個類型的實例。盡管構造函數不是方法,但是它們在編碼的時候使用了非常相似的語法。構造函數通過確保所有實例的屬性都是有效的來創建一個新的實例。

構造函數最簡單的形式是使用init關鍵詞的一個類似方法的函數,并且沒有任何參數:

復制代碼代碼如下:
 
init() {
    // perform some initialization here
}

使用構造函數語法TypeName和空的兩個小括號來完成一個Vehicle實例的創建:

 

 

復制代碼代碼如下:
 
let someVehicle = Vehicle()

 

Vehicle的構造函數為屬性設置了一些初始值(numberOfWheels = 0 然后 maxPassengers = 1)。

Vehicle類定義的是一個通用的交通工具特性,它本身沒有太多意義,所以就需要沖定義它的一些屬性或者方法來讓它具有實際的意義。

2、產生子類

產生子類就是根據一個已有的類產生新類的過程。子類繼承了父類的一些可以修改的特性。還可以為子類添加一些新的特性。

為了表明一個類是繼承自一個父類,需要將父類的名稱寫在子類的后面,并且用冒號分隔:

 

復制代碼代碼如下:
 
class SomeClass: SomeSuperclass {
    // class definition goes here
}

下面的例子定義了一種特定叫Bicycle的交通工具。這個新類是基于已有的類Vehicle產生的。書寫方式是在類名Bicycle后加冒號加父類Vehicle名。

 

可以理解為:

定義一個新的類叫Bicycle,它繼承了Vehicle的特性:

 

復制代碼代碼如下:
 
class Bicycle: Vehicle {
    init() {
        super.init()
        numberOfWheels = 2
    }
}

 

Bicycle是Vehicle的子類,Vehicle是Bicycle的父類。Bicycle類繼承了Vehicle所有的特征,比如maxPassengers和numberOfWheels屬性。你還可以為Bicycle類添加心的屬性。

Bicycle類也定義了構造函數,在這個構造函數中調用了父類的構造函數super.init(),這樣可以確保在Bicycle修改他們之前,父類已經初始化了。

注意:跟Objective-C不同的是,Swift中的構造函數沒有默認繼承。更多信息可以參考Initializer Inheritance and Overriding這一章節。

maxPassengers屬性在繼承自父類的時候已經被初始化了,對于Bicycle來說是正確的,因此不需要再做更改。然后numberOfWheels是不對的,所以被替換成了2.

不僅屬性是繼承于Vehicle的,Bicycle還繼承了父類的方法。如果你創建一個實例,然后調用了已經繼承的description方法,可以得到該交通工具的描述并且看到它的屬性已經被修改:

 

復制代碼代碼如下:
 
let bicycle = Bicycle()
println("Bicycle: /(bicycle.description())")
// Bicycle: 2 wheels; up to 1 passengers

子類本身也可以作為父類被再次繼承:

 

 

復制代碼代碼如下:
 
class Tandem: Bicycle {
    init() {
        super.init()
        maxPassengers = 2
    }
}

上面的例子創建了Bicycle的子類,叫做tandem,也就可以兩個人一起騎的自行車。所以Tandem沒有修改numberOfWheels屬性,只是更新了maxPassengers屬性。

 

注意:子類只能夠在構造的時候修改變量的屬性,不能修改常量的屬性。

創建一個Tandem的實例,然后調用description方法檢查屬性是否被正確修改:

 

復制代碼代碼如下:
 
let tandem = Tandem()
println("Tandem: /(tandem.description())")
// Tandem: 2 wheels; up to 2 passengers

 

注意到description方法也被Tandem繼承了。

3、重寫方法

子類可以提供由父類繼承來的實例方法,類方法,實例屬性或者下標的個性化實現。這個特性被稱為重寫。

重寫一個由繼承而來的方法需要在方法定義前標注override關鍵詞。通過這樣的操作可以確保你所要修改的這個方法確實是繼承而來的,而不會出現重寫錯誤。錯誤的重寫會造成一些不可預知的錯誤,所以如果如果不標記override關鍵詞的話,就會被在代碼編譯時報錯。

override關鍵詞還能夠讓Swift編譯器檢查該類的父類是否有相符的方法,以確保你的重寫是可用的,正確的。

訪問父類方法,屬性和下標

當在重寫子類繼承自父類的方法,屬性或者下標的時候,需要用到一部分父類已有的實現。比如你可以重定義已知的一個實現或者在繼承的變量中存儲一個修改的值。

適當的時候,可以通過使用super前綴來訪問父類的方法,屬性或者下標:

叫someMethod的重寫方法可以在實現的時候通過super.someMethod()調用父類的someMethod方法。

叫someProperty的重寫屬性可以在重寫實現getter或者setter的時候通過super.someProperty調用父類的someProperty。

叫someIndex的重寫下標可以在實現下標的時候通過super[someIndex]來訪問父類的下標。

復寫方法

你可以在你的子類中實現定制的繼承于父類的實例方法或者類方法。

下面的例子演示的就是一個叫Car的Vehicle子類,重寫了繼承自Vehicle的description方法。

 

復制代碼代碼如下:
 
class Car: Vehicle {
    var speed: Double = 0.0
    init() {
        super.init()
        maxPassengers = 5
        numberOfWheels = 4
    }
    override func description() -> String {
        return super.description() + "; "
            + "traveling at /(speed) mph"
    }
}

 

Car中定義了一個新的Double類型的存儲屬性speed。這個屬性默認值是0.0,意思是每小時0英里。Car還有一個自定義的構造函數,設置了最大乘客數為5,輪子數量是4.

Car重寫了繼承的description方法,并在方法名description前標注了override關鍵詞。

在description中并沒有給出了一個全新的描述實現,還是通過super.description使用了Vehicle提供的部分描述語句,然后加上了自己定義的一些屬性,如當前速度。

如果你創建一個Car的實例,然后調用description方法,會發現描述語句變成了這樣:

 

復制代碼代碼如下:

let car = Car()
println("Car: /(car.description())")
// Car: 4 wheels; up to 5 passengers; traveling at 0.0 mph

 

復寫屬性

你還可以提供繼承自父類的實例屬性或者類屬性的個性化getter和setter方法,或者是添加屬性觀察者來實現重寫的屬性可以觀察到繼承屬性的變動。

重寫屬性的Getters和Setters

不管在源類中繼承的這個屬性是存儲屬性還是計算屬性,你都可以提供一個定制的getter或者setter方法來重寫這個繼承屬性。子類一般不會知道這個繼承的屬性本來是存儲屬性還是計算屬性,但是它知道這個屬性有特定的名字和類型。在重寫的時候需要指明屬性的類型和名字,好讓編譯器可以檢查你的重寫是否與父類的屬性相符。

你可以將一個只讀的屬性通過提那家getter和setter繼承為可讀寫的,但是反之不可。

注意:如果你為一個重寫屬性提供了setter方法,那么也需要提供getter方法。如果你不想在getter中修改繼承的屬性的值,可以在getter中使用super.someProperty即可,在下面SpeedLimitedCar例子中也是這樣。

下面的例子定義了一個新類SpeedLimitedCar,是Car的一個子類。這個類表示一個顯示在40碼一下的車輛。通過重寫繼承的speed屬性來實現:

 

復制代碼代碼如下:

class SpeedLimitedCar: Car {
    override var speed: Double  {
    get {
        return super.speed
    }
    set {
        super.speed = min(newValue, 40.0)
    }
    }
}

每當你要設置speed屬性的時候,setter都會檢查新值是否比40大,二者中較小的值會被設置給SpeedLimitedCar。

 

如果你嘗試為speed設置超過40的值,description的輸出依然還是40:

 

復制代碼代碼如下:

let limitedCar = SpeedLimitedCar()
limitedCar.speed = 60.0
println("SpeedLimitedCar: /(limitedCar.description())")
// SpeedLimitedCar: 4 wheels; up to 5 passengers; traveling at 40.0 mph

 

重寫屬性觀察者

你可以使用屬性重寫為繼承的屬性添加觀察者。這種做法可以讓你無論這個屬性之前是如何實現的,在繼承的這個屬性變化的時候都能得到提醒。更多相關的信息可以參考Property Observers這章。

注意:不能為繼承的常量存儲屬性或者是只讀計算屬性添加觀察者。這些屬性值是不能被修改的,因此不適合在重寫實現時添加willSet或者didSet方法。

注意:不能同時定義重寫setter和重寫屬性觀察者,如果想要觀察屬性值的變化,并且又為該屬性給出了定制的setter,那只需要在setter中直接獲得屬性值的變化就行了。

下面的代碼演示的是一個新類AutomaticCar,也是Car的一個子類。這個類表明一個擁有自動變速箱的汽車,可以根據現在的速度自動選擇檔位,并在description中輸出當前檔位:

 

復制代碼代碼如下:

class AutomaticCar: Car {
    var gear = 1
    override var speed: Double {
    didSet {
        gear = Int(speed / 10.0) + 1
    }
    }
    override func description() -> String {
        return super.description() + " in gear /(gear)"
    }
}

 

這樣就可以實現,每次你設置speed的值的時候,didSet方法都會被調用,來看檔位是否需要變化。gear是由speed除以10加1計算得來,所以當速度為35的時候,gear檔位為4:

 

復制代碼代碼如下:

let automatic = AutomaticCar()
automatic.speed = 35.0
println("AutomaticCar: /(automatic.description())")
// AutomaticCar: 4 wheels; up to 5 passengers; traveling at 35.0 mph in gear 4

 

4、禁止重寫

你可以通過標記final關鍵詞來禁止重寫一個類的方法,屬性或者下標。在定義的關鍵詞前面標注@final屬性即可。

在子類中任何嘗試重寫父類的final方法,屬性或者下標的行為都會在編譯時報錯。同樣在擴展中為類添加的方法,屬性或者下標也可以被標記為final。

還可以在類關鍵詞class前使用@final標記一整個類為final(@final class)。任何子類嘗試繼承這個父類時都會在編譯時報錯。



注:相關教程知識閱讀請移步到swift教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
4438全国亚洲精品在线观看视频| 久久久爽爽爽美女图片| 亚洲精品xxxx| 久久久日本电影| 亚洲直播在线一区| 亚洲成人av片在线观看| 欧美成人免费一级人片100| 色av中文字幕一区| 国产精品自拍偷拍视频| 国产精品黄页免费高清在线观看| 国产精品99久久久久久久久| 2025国产精品视频| 91久久精品美女| 国产精品免费久久久久久| 国产v综合v亚洲欧美久久| 亚洲va久久久噜噜噜久久天堂| 日韩在线视频一区| 亚洲精品免费一区二区三区| 国产精品va在线播放我和闺蜜| 日韩免费观看av| 久久精品国产久精国产思思| 中文国产亚洲喷潮| 久久人人爽人人爽人人片av高清| 亚洲精品v欧美精品v日韩精品| 最近2019中文字幕大全第二页| 日本欧美一级片| 亚洲欧美日本伦理| 亚洲日韩第一页| 在线观看日韩视频| 久久精品青青大伊人av| 最近2019好看的中文字幕免费| 成人看片人aa| 欧美日韩国产精品一区二区三区四区| 国产suv精品一区二区三区88区| 另类视频在线观看| 538国产精品一区二区在线| 国产不卡av在线| www.日韩视频| 91精品国产综合久久香蕉最新版| 亚洲精品视频久久| 日韩成人av一区| 欧美日韩亚洲视频一区| 日韩av在线播放资源| 91免费福利视频| 日韩视频免费大全中文字幕| 日韩av中文字幕在线免费观看| 亚洲综合在线中文字幕| 中文字幕久久精品| 国产一区二区三区在线视频| www.日韩.com| 日韩av在线免播放器| 美女av一区二区三区| 在线观看中文字幕亚洲| 日韩欧美中文第一页| 国产精品久久久久久久久久免费| 欧美一级电影久久| 国产激情综合五月久久| 深夜福利一区二区| 中文字幕综合一区| 国产噜噜噜噜久久久久久久久| 亚洲大胆人体av| 黑人精品xxx一区一二区| 96pao国产成视频永久免费| 草民午夜欧美限制a级福利片| 欧洲亚洲妇女av| 中文字幕精品久久久久| 亚洲欧洲免费视频| 国内精品久久久久久| 欧美xxxx18性欧美| 日韩精品一区二区三区第95| 久久精品国产成人| 国产精品九九久久久久久久| 成人av电影天堂| 午夜精品一区二区三区在线视| 国产香蕉97碰碰久久人人| 久久视频在线播放| 国产成人一区二区在线| 久久亚洲一区二区三区四区五区高| 大荫蒂欧美视频另类xxxx| 久久亚洲影音av资源网| 国产精品久久在线观看| 久久久成人av| 欧美精品制服第一页| 国产精品视频99| 久久久www成人免费精品张筱雨| 亚洲国产成人精品久久| 日韩精品小视频| 欧美性一区二区三区| 亚洲欧美一区二区激情| 日韩中文字幕视频在线观看| 国产成人涩涩涩视频在线观看| 4p变态网欧美系列| 国产亚洲精品久久久久久| 国产精品九九久久久久久久| 国产91精品网站| 日韩av影院在线观看| 91中文字幕在线| 欧美性生活大片免费观看网址| 91免费看视频.| 国产v综合ⅴ日韩v欧美大片| 欧美黑人巨大xxx极品| 国产精品九九久久久久久久| 精品偷拍一区二区三区在线看| 成人xxxxx| 性欧美在线看片a免费观看| 日韩三级影视基地| 成人亚洲欧美一区二区三区| 97色在线观看免费视频| 日韩色av导航| 欧美一区二区三区……| 亚洲少妇中文在线| 在线观看国产精品91| 欧美日韩福利在线观看| 亚洲国产欧美日韩精品| 成人欧美一区二区三区黑人孕妇| 国产欧美日韩丝袜精品一区| 国产日韩欧美在线观看| 国产精品女人网站| 亚洲女同精品视频| 国产精品美女www| 欧美高清视频在线播放| 精品在线观看国产| 在线播放日韩专区| 亚洲自拍另类欧美丝袜| 国产精品久久久久久久久久东京| 国产精品第一视频| 一区二区在线视频播放| 欧美激情女人20p| 91精品国产综合久久香蕉的用户体验| 亚洲一级黄色av| 蜜月aⅴ免费一区二区三区| 91久久国产综合久久91精品网站| 欧美精品一区二区三区国产精品| 国产98色在线| 亚洲欧美日韩精品| 一区二区三区回区在观看免费视频| 国产精品爽黄69| 久久久久在线观看| 亚洲男人第一网站| 欧美日韩一区二区免费在线观看| 国产精品日韩欧美| 欧美精品第一页在线播放| www.欧美视频| 日韩精品视频在线播放| 国内精品小视频在线观看| 欧美日韩高清在线观看| 亚洲精品乱码久久久久久金桔影视| 18久久久久久| 日韩电影免费观看在线| 日本精品久久中文字幕佐佐木| 欧美日本亚洲视频| 久久精品国产成人| 亚洲韩国日本中文字幕| www.亚洲天堂| 成人国产在线激情| 欧美日韩第一视频| 日韩中文字在线| 成人欧美在线视频| 亚洲欧洲偷拍精品| 亚洲日韩中文字幕| 午夜欧美不卡精品aaaaa| 日韩久久精品电影| 精品视频一区在线视频| 欧美激情亚洲综合一区|