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

首頁 > 編程 > Swift > 正文

Swift教程之繼承詳解

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

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

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

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

1、定義一個基類

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

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

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

 

復(fù)制代碼代碼如下:

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

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

 

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

構(gòu)造函數(shù)最簡單的形式是使用init關(guān)鍵詞的一個類似方法的函數(shù),并且沒有任何參數(shù):

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

使用構(gòu)造函數(shù)語法TypeName和空的兩個小括號來完成一個Vehicle實例的創(chuàng)建:

 

 

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

 

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

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

2、產(chǎn)生子類

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

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

 

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

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

 

可以理解為:

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

 

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

 

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

Bicycle類也定義了構(gòu)造函數(shù),在這個構(gòu)造函數(shù)中調(diào)用了父類的構(gòu)造函數(shù)super.init(),這樣可以確保在Bicycle修改他們之前,父類已經(jīng)初始化了。

注意:跟Objective-C不同的是,Swift中的構(gòu)造函數(shù)沒有默認(rèn)繼承。更多信息可以參考Initializer Inheritance and Overriding這一章節(jié)。

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

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

 

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

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

 

 

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

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

 

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

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

 

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

 

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

3、重寫方法

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

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

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

訪問父類方法,屬性和下標(biāo)

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

適當(dāng)?shù)臅r候,可以通過使用super前綴來訪問父類的方法,屬性或者下標(biāo):

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

叫someProperty的重寫屬性可以在重寫實現(xiàn)getter或者setter的時候通過super.someProperty調(diào)用父類的someProperty。

叫someIndex的重寫下標(biāo)可以在實現(xiàn)下標(biāo)的時候通過super[someIndex]來訪問父類的下標(biāo)。

復(fù)寫方法

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

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

 

復(fù)制代碼代碼如下:
 
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。這個屬性默認(rèn)值是0.0,意思是每小時0英里。Car還有一個自定義的構(gòu)造函數(shù),設(shè)置了最大乘客數(shù)為5,輪子數(shù)量是4.

Car重寫了繼承的description方法,并在方法名description前標(biāo)注了override關(guān)鍵詞。

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

如果你創(chuàng)建一個Car的實例,然后調(diào)用description方法,會發(fā)現(xiàn)描述語句變成了這樣:

 

復(fù)制代碼代碼如下:

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

 

復(fù)寫屬性

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

重寫屬性的Getters和Setters

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

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

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

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

 

復(fù)制代碼代碼如下:

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

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

 

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

 

復(fù)制代碼代碼如下:

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

 

重寫屬性觀察者

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

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

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

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

 

復(fù)制代碼代碼如下:

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)"
    }
}

 

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

 

復(fù)制代碼代碼如下:

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、禁止重寫

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

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

還可以在類關(guān)鍵詞class前使用@final標(biāo)記一整個類為final(@final class)。任何子類嘗試?yán)^承這個父類時都會在編譯時報錯。



注:相關(guān)教程知識閱讀請移步到swift教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
国产探花精品一区二区| 婷婷六月天在线| 亚洲www免费| 天天综合中文字幕| 日韩av在线天堂网| 久久综合国产精品台湾中文娱乐网| 中文字幕免费高清网站| 91porny九色| 免费av在线网站| 成人高清在线观看视频| 色先锋av男人资源先锋影院| 国产美女www爽爽爽视频| 国产成人福利网站| 成人免费网站在线观看| 亚洲精品人成网在线播放影院| 91精品久久香蕉国产线看观看| 亚洲乱码日产精品bd在线观看| 亲子伦视频一区二区三区| 亚洲欧美国产精品专区久久| 韩国久久久久久| ass白嫩白嫩的小美女| 黄上黄在线观看| 亚洲激情啪啪| 成人a在线视频免费观看| 亚洲人成网站77777在线观看| 国产精品99无码一区二区| 免费av大全| av蓝导航精品导航| 韩国三级电影在线观看婷婷| 欧美亚洲一区二区三区| 中文字幕一区二区在线视频| 韩国精品久久久999| 99国产精品免费网站| 欧美黄色一级| 亚洲午夜未满十八勿入免费观看全集| 五月激情婷婷在线| 午夜宅男久久久| 久久久久久久久久久久久国产精品| 亚洲精品乱码电影在线观看| 成人网欧美在线视频| 久久久午夜视频| 亚洲天天做日日做天天谢日日欢| 亚洲精品成人网| 国产日韩欧美一区二区东京热| 四虎影视最新地址| 三级影片在线观看欧美日韩一区二区| 中文字幕在线观看日韩| 欧美激情第10页| 久久久91精品国产一区二区精品| 九色porny丨首页入口在线| 久本草在线中文字幕亚洲欧美| 三上悠亚久久精品| 五月婷婷伊人网| 这里只有视频精品| 国内偷自视频区视频综合| 国产99视频在线观看| 男女性色大片免费观看一区二区| 亚洲女性喷水在线观看一区| 午夜日韩电影| 欧美视频在线视频精品| 欧美日韩国产综合视频在线| 亚洲最新视频在线| 色噜噜国产精品视频一区二区| 大奶一区二区三区| 涩爱av在线播放一区二区| 性做爰过程免费播放| 国产精品香蕉一区二区三区| 日韩欧美视频第二区| 日本中文字幕在线一区| 欧美激情一级精品国产| 久久精品亚洲一区二区三区浴池| 免费在线观看的黄色网址| 九九99久久精品在免费线bt| 国产成人精品影院| 无码人妻精品一区二区三区66| 欧美成人一区二区三区四区| 日韩精品免费视频一区二区三区| 亚洲国产99| 91污在线观看| 日韩av在线网页| 免费日韩电影| 3dmax动漫人物在线看| 亚洲成人综合网站| 超级砰砰砰97免费观看最新一期| 天堂av在线电影| 野外做受又硬又粗又大视频√| 色综合91久久精品中文字幕| 成人日批视频| 一区二区三区免费在线| 亚洲精品视频在线观看视频| 国产精品的网站| 久久国产麻豆精品| 黄网网址免费| 久久久综合亚洲91久久98| 欧美在线电影| www.综合网.com| 日本美女一区二区三区视频| 国产乱码午夜在线视频| 亚洲精品综合精品自拍| 欧美xxxx黑人又粗又长密月| 国产欧美日韩中文字幕在线| 国产精品99精品无码视| 亚洲综合色站| 深夜福利视频网站| 日韩av资源在线播放| 日韩a**中文字幕| 四虎影视2018在线播放alocalhost| 久久久欧美精品sm网站| 男人的天堂亚洲一区| 久久精品论坛| 国产精品无码天天爽视频| 亚洲乱码在线观看| 韩国日本不卡在线| 欧美三级第一页| 中文字幕色一区二区| 国产日韩欧美不卡| 韩国中文字幕2020精品| 粉嫩av懂色av蜜臀av分享| 爱草tv视频在线观看992| 日韩最新中文字幕电影免费看| 中文字幕永久视频| 成人激情视频网| 精品推荐蜜桃传媒| 91九色porn蝌蚪| 日韩在线观看免费高清完整版| 日本污视频网站| 夜夜骑日日操| 色一情一乱一乱一区91| 果冻天美麻豆一区二区国产| 国内自拍偷拍视频| 色橹橹欧美在线观看视频高清| 澳门av一区二区三区| 亚洲精品美女在线观看播放| 亚洲精品美女久久| 国产精品无码电影| 色www精品视频在线观看| 色戒汤唯在线观看| 91成人在线观看国产| 无码人妻久久一区二区三区蜜桃| jizz国产视频| 你懂的国产精品永久在线| 久久伊人蜜桃av一区二区| 婷婷国产在线| 宅男av一区二区三区| 在线播放精品一区二区三区| 国产精品久久久久一区二区三区| 久久久久久久久久一区| 亚洲免费在线视频一区 二区| 日本一极黄色片| 天天操天天操天天操天天| 男人添女人下面免费视频| 国产综合精品久久| 岛国精品资源网站| 日本中文字幕二区| 国产精品久久久久久久久久久久久久久久久久| 国产精品不卡一区二区三区| freesex欧美| 含羞草www国产在线视频| 国产情侣一区二区三区| 99成人在线观看| 久久欧美肥婆一二区| 精品一区二区三区在线观看l| 国产精品日韩欧美一区二区| 日本欧美亚洲| 伦理在线一区| 欧美丰满少妇xxxxx| 自拍视频网站| 精品中文一区| 亚洲自拍偷拍另类| 日韩午夜在线观看| 亚洲黑人在线| 国产精品久久久久久久免费| 欧美国产日韩精品免费观看| 91丨九色porny丨蝌蚪| 欧美大尺度做爰床戏| 黑人精品欧美一区二区蜜桃| 亚洲精品成人av久久| 综合136福利视频在线| 鲁大师影院一区二区三区| 91麻豆国产自产在线观看| 日本一区免费看| 日韩亚洲视频在线| 香港欧美日韩三级黄色一级电影网站| av免费网站在线观看| 手机av在线播放| 亚洲v日韩v综合v精品v| 欧美高清在线一区| 国产95亚洲| 色哦色哦哦色天天综合| 色88久久久久高潮综合影院| 欧美日本三级| 亚洲 日韩 国产第一区| 久久精品超碰| 国产伦精品一区二区三区免费优势| 91官网在线免费观看| 免费毛片一区二区三区久久久| 色综合久久88色综合天天| 精品伦精品一区二区三区视频| 中文字幕av不卡在线| 欧美一级片在线播放| 亚洲午夜久久久久久久久电影网| 一区二区三区在线观看欧美| 伊人久久在线| 国产韩日精品| 深夜视频在线观看| av免费观看久久| 欧美性xxxxxx少妇| 久久久久久久久久久91| 先锋资源一区| 精品久久久久久中文字幕人妻最新| 国产福利成人在线| 日韩中文av在线| 国产精品任我爽爆在线播放| 日本中文字幕成人| 久久91视频| 91看片淫黄大片91| 精品1区2区在线观看| 91玉足脚交白嫩脚丫| av毛片在线播放| 久久精品国产第一区二区三区最新章节| 成人av电影在线播放| 国产免费一区二区三区香蕉精| 欧美成人精品欧美一| 欧美日韩一区二区三区在线电影| 色综合天天综合网中文字幕| 91精品久久久久久综合五月天| 97秋霞电影网| 免费a级片在线观看| 欧美巨胸大乳hitomi| 日韩视频在线视频| 夜夜精品视频一区二区| 7777精品久久久大香线蕉| 奇米成人av国产一区二区三区| 国产精品一品二区三区的使用体验| 在线视频中文字幕一区二区| 5858s免费视频成人| 亚洲狠狠婷婷综合久久久久图片| 欧美午夜女人视频在线| 中文字幕亚洲一区二区三区| 精品久久久久国产| julia中文字幕一区二区99在线| 欧美xxxxx牲另类人与| 手机看片久久| 狠狠狠狠狠狠狠| 91丨porny丨最新| 一区二区国产欧美| 日韩理论电影中文字幕| 精品视频一区 二区 三区| 国内精品久久久久影院薰衣草| 69免费视频| 九色综合婷婷综合| 国产成人三级在线观看| 国产精品夜夜夜爽张柏芝| 亚洲色图.com| 一本色道久久亚洲综合精品蜜桃| 亚洲一区二区中文字幕在线观看| 欧美色图亚洲视频| 91精品国产黑色紧身裤美女| www.桃色av嫩草.com| 久久人人爽人人片| 色一情一乱一伦一区二区三欧美| 国产一区日韩欧美| 久久影视免费观看| 色婷婷av一区二区三区之一色屋| 日本一区视频在线观看免费| 视频一区二区中文字幕| 亚洲免费观看高清完整版在线观看熊| 久久99精品国产.久久久久久| 亚洲天堂久久| 粉嫩高清一区二区三区精品视频| 久草中文在线视频| 一区二区三区视频在线观看| 一区二区三区日韩视频| 精品一区二区三区蜜桃在线| 亚洲国产精品电影| 亚洲一区国产视频| 中文字幕欧美人妻精品一区| 国产v日产∨综合v精品视频| 精品黑人一区二区三区在线观看| 国产欧美一区二区三区精品观看| 北岛玲一区二区三区四区| 99亚洲国产精品| 日本在线视频中文有码| 成人高潮成人免费观看| 欧美变态凌虐bdsm| 欧美一级免费在线| 亚洲欧洲成人精品av97| 69**夜色精品国产69乱| 国产精品123区| 中文字幕亚洲自拍| 欧美成人观看免费全部完小说| 色综合久久久久久久久五月| 8×8x拔擦拔擦在线视频网站| 黄色在线资源| 少妇精品视频一区二区免费看| 国产成人av一区二区| 亚洲综合一二三区| 国产福利片在线观看| 久久99久久99| 一区二区久久精品| 18禁免费无码无遮挡不卡网站| 国产91精品欧美| 午夜视频精品| 亚洲精品电影在线观看| 国产91在线观看丝袜| 亚洲毛片网站| 寂寞护士中文字幕mp4| 国产精品久久观看| 久久久欧美一区二区| 伊人天天久久大香线蕉av色| 草草影院在线| 国产成人无码精品亚洲| 91网站免费视频| 暖暖视频在线免费观看| 亚洲欧美日韩视频二区| free极度另类性欧美| 色88888久久久久久影院按摩| 成人中文字幕在线观看| 久久精品视频导航| 日本亚洲天堂| 久久精品无码一区二区日韩av| 国产一二三四区在线| 精品国产乱码一区二区三区| 欧美性bbwbbwbbwhd| 亚洲美女一区二区三区| 国产视频亚洲色图| 国产suv精品一区二区四区视频| 黑丝一区二区三区|