Swift教程之繼承

繼承

類可以從另一個(gè)類繼承方法蟀俊、屬性和其他特性,繼承類稱為子類订雾,被繼承類為其超類肢预。Swift的類可以調(diào)用和訪問(wèn)超類的方法、屬性和下標(biāo)葬燎,并能重寫這些版本以改進(jìn)或修改其行為误甚。

類還可以將屬性觀察器添加到繼承的屬性缚甩,屬性觀察器可以添加到任何屬性。

<br />

定義基類

基類是不繼承任何一個(gè)類的類窑邦。

注意

Swift類不會(huì)從通用基類繼承擅威,未指定超類的自定義類自動(dòng)成為基類。

以下為一個(gè)自定義Vehicle基類:

class Vehicle {
    var currentSpeed = 0.0
    var description: String {
        return "traveling at \(currentSpeed) miles per hour"
    }
    func makeNoise() {
        // do nothing - an arbitrary vehicle doesn't necessarily make a noise
    }
}

使用初始化器語(yǔ)法創(chuàng)建一個(gè)類實(shí)例:

let someVehicle = Vehicle()

訪問(wèn)其description屬性:

print("Vehicle: \(someVehicle.description)")
// Vehicle: traveling at 0.0 miles per hour

<br />

子類化

子類化是將一個(gè)新類置于現(xiàn)有類之上的行為冈钦,子類繼承現(xiàn)有類的特性郊丛,也可以向子類添加新特性。

繼承語(yǔ)法如下:

class SomeSubclass: SomeSuperclass {
    // subclass definition goes here
}

子類化Vehicle類:

class Bicycle: Vehicle {
    var hasBasket = false
}

let bicycle = Bicycle()
bicycle.hasBasket = true

bicycle.currentSpeed = 15.0
print("Bicycle: \(bicycle.description)")
// Bicycle: traveling at 15.0 miles per hour

子類繼續(xù)子類化:

class Tandem: Bicycle {
    var currentNumberOfPassengers = 0
}

let tandem = Tandem()
tandem.hasBasket = true
tandem.currentNumberOfPassengers = 2
tandem.currentSpeed = 22.0
print("Tandem: \(tandem.description)")
// Tandem: traveling at 22.0 miles per hour

<br />

重寫

子類可以提供自定義的從超類繼承來(lái)的實(shí)例方法瞧筛、類型方法厉熟、實(shí)例屬性、類型屬性或下標(biāo)较幌,稱為重寫揍瑟。

使用override關(guān)鍵字重寫超類的特性,沒有關(guān)鍵字的任何重寫會(huì)導(dǎo)致編譯錯(cuò)誤乍炉。

訪問(wèn)超類方法绢片、屬性和下標(biāo)

當(dāng)子類重寫方法、屬性或下標(biāo)時(shí)岛琼,可以將現(xiàn)有超類的實(shí)現(xiàn)用作重寫的一部分底循,即在超類實(shí)現(xiàn)基礎(chǔ)上重寫。這時(shí)使用super前綴訪問(wèn)方法槐瑞、屬性或下標(biāo)的超類版本:

  • 名為someMethod()的重寫方法可以通過(guò)在重寫方法實(shí)現(xiàn)中調(diào)用super.someMetho()來(lái)調(diào)用someMethod()的超類版本熙涤。

  • 被稱為someProperty的被覆蓋的屬性可以在超級(jí)的gettersetter實(shí)現(xiàn)中以super.someProperty方式訪問(wèn)someProperty的超類版本。

  • someIndex的覆蓋下標(biāo)可以從覆蓋的下標(biāo)實(shí)現(xiàn)中訪問(wèn)與super [someIndex]相同的下標(biāo)的超類版本困檩。

方法重寫

可以重寫繼承的實(shí)例或類型方法來(lái)提供子類中定制或替代方法的方法祠挫。

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

let train = Train()
train.makeNoise()
// Prints "Choo Choo"

屬性重寫

可以重寫繼承的實(shí)例或類型屬性,為該屬性提供自定義gettersetter窗看,或添加屬性觀察器以啟用重寫屬性來(lái)觀察底層屬性值何時(shí)更改茸歧。

getter和setter屬性重寫

可以提供自定義的getter(和setter)來(lái)覆蓋任何繼承的屬性,必須始終聲明要覆蓋的屬性名和類型显沈,以便編譯器檢查重寫是否與具有同名同類型的超類屬性匹配。

可以為超類的只讀屬性的重寫同時(shí)提供gettersetter修改為讀寫屬性逢唤,但不能將超類的讀寫屬性重寫為只讀屬性拉讯。

注意

當(dāng)重寫屬性提供了setter時(shí),還必須提供getter鳖藕。若不想覆蓋getter修改繼承屬性的值魔慷,可以從getter中返回super.someProperty以維持超類屬性的getter實(shí)現(xiàn)。

以下為子類重寫超類description屬性并在超類實(shí)現(xiàn)基礎(chǔ)上添加新功能:

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

let car = Car()
car.currentSpeed = 25.0
car.gear = 3
print("Car: \(car.description)")
// Car: traveling at 25.0 miles per hour in gear 3

屬性觀察器重寫

重寫屬性會(huì)講超類的屬性觀察器添加到繼承的屬性著恩,不論該屬性的實(shí)現(xiàn)方法如何都將能夠在繼承屬性的值更改時(shí)收到通知院尔。

注意

不能將屬性觀察器添加到繼承的常量存儲(chǔ)型屬性或只讀計(jì)算型屬性蜻展,因?yàn)檫@些屬性值不能更改。不能為同一屬性同時(shí)提供重寫的setter和重寫的屬性觀察器邀摆,若要監(jiān)聽屬性值的更改纵顾,并且已經(jīng)提供重寫的setter,則可以簡(jiǎn)單地監(jiān)聽重寫的setter中任何值的更改栋盹。

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

let automatic = AutomaticCar()
automatic.currentSpeed = 35.0
print("AutomaticCar: \(automatic.description)")
// AutomaticCar: traveling at 35.0 miles per hour in gear 4

<br />

防止重寫

通過(guò)將方法施逾、屬性或下標(biāo)標(biāo)記為final防止被子類重寫,如final var例获,final func汉额,final class funfinal subscript

任何試圖在子類中重寫標(biāo)記為final的方法榨汤、屬性或下標(biāo)都將報(bào)告編譯錯(cuò)誤蠕搜,也可以在擴(kuò)展中使用final關(guān)鍵字。

可以在類定義中的class關(guān)鍵字之前添加final修飾符防止該類被子類化收壕,任何試圖子類化標(biāo)記為final的類都將報(bào)告編譯錯(cuò)誤妓灌。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市啼器,隨后出現(xiàn)的幾起案子旬渠,更是在濱河造成了極大的恐慌,老刑警劉巖端壳,帶你破解...
    沈念sama閱讀 219,188評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件告丢,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡损谦,警方通過(guò)查閱死者的電腦和手機(jī)岖免,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)照捡,“玉大人颅湘,你說(shuō)我怎么就攤上這事±蹙” “怎么了闯参?”我有些...
    開封第一講書人閱讀 165,562評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)悲立。 經(jīng)常有香客問(wèn)我鹿寨,道長(zhǎng),這世上最難降的妖魔是什么薪夕? 我笑而不...
    開封第一講書人閱讀 58,893評(píng)論 1 295
  • 正文 為了忘掉前任脚草,我火速辦了婚禮,結(jié)果婚禮上原献,老公的妹妹穿的比我還像新娘馏慨。我一直安慰自己埂淮,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,917評(píng)論 6 392
  • 文/花漫 我一把揭開白布写隶。 她就那樣靜靜地躺著倔撞,像睡著了一般。 火紅的嫁衣襯著肌膚如雪樟澜。 梳的紋絲不亂的頭發(fā)上误窖,一...
    開封第一講書人閱讀 51,708評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音秩贰,去河邊找鬼霹俺。 笑死,一個(gè)胖子當(dāng)著我的面吹牛毒费,可吹牛的內(nèi)容都是我干的丙唧。 我是一名探鬼主播,決...
    沈念sama閱讀 40,430評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼觅玻,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼想际!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起溪厘,我...
    開封第一講書人閱讀 39,342評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤胡本,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后畸悬,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體侧甫,經(jīng)...
    沈念sama閱讀 45,801評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,976評(píng)論 3 337
  • 正文 我和宋清朗相戀三年蹋宦,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了披粟。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,115評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡冷冗,死狀恐怖守屉,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蒿辙,我是刑警寧澤拇泛,帶...
    沈念sama閱讀 35,804評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站思灌,受9級(jí)特大地震影響碰镜,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜习瑰,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,458評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望秽荤。 院中可真熱鬧甜奄,春花似錦柠横、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至烟阐,卻和暖如春搬俊,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蜒茄。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工唉擂, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人檀葛。 一個(gè)月前我還...
    沈念sama閱讀 48,365評(píng)論 3 373
  • 正文 我出身青樓玩祟,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親屿聋。 傳聞我的和親對(duì)象是個(gè)殘疾皇子空扎,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,055評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容