Swift教程之繼承

繼承

類可以從另一個類繼承方法、屬性和其他特性,繼承類稱為子類,被繼承類為其超類。Swift的類可以調用和訪問超類的方法、屬性和下標,并能重寫這些版本以改進或修改其行為。

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

<br />

定義基類

基類是不繼承任何一個類的類。

注意

Swift類不會從通用基類繼承,未指定超類的自定義類自動成為基類。

以下為一個自定義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
    }
}

使用初始化器語法創建一個類實例:

let someVehicle = Vehicle()

訪問其description屬性:

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

<br />

子類化

子類化是將一個新類置于現有類之上的行為,子類繼承現有類的特性,也可以向子類添加新特性。

繼承語法如下:

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

子類繼續子類化:

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 />

重寫

子類可以提供自定義的從超類繼承來的實例方法、類型方法、實例屬性、類型屬性或下標,稱為重寫。

使用override關鍵字重寫超類的特性,沒有關鍵字的任何重寫會導致編譯錯誤。

訪問超類方法、屬性和下標

當子類重寫方法、屬性或下標時,可以將現有超類的實現用作重寫的一部分,即在超類實現基礎上重寫。這時使用super前綴訪問方法、屬性或下標的超類版本:

  • 名為someMethod()的重寫方法可以通過在重寫方法實現中調用super.someMetho()來調用someMethod()的超類版本。

  • 被稱為someProperty的被覆蓋的屬性可以在超級的gettersetter實現中以super.someProperty方式訪問someProperty的超類版本。

  • someIndex的覆蓋下標可以從覆蓋的下標實現中訪問與super [someIndex]相同的下標的超類版本。

方法重寫

可以重寫繼承的實例或類型方法來提供子類中定制或替代方法的方法。

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

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

屬性重寫

可以重寫繼承的實例或類型屬性,為該屬性提供自定義gettersetter,或添加屬性觀察器以啟用重寫屬性來觀察底層屬性值何時更改。

getter和setter屬性重寫

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

可以為超類的只讀屬性的重寫同時提供gettersetter修改為讀寫屬性,但不能將超類的讀寫屬性重寫為只讀屬性。

注意

當重寫屬性提供了setter時,還必須提供getter。若不想覆蓋getter修改繼承屬性的值,可以從getter中返回super.someProperty以維持超類屬性的getter實現。

以下為子類重寫超類description屬性并在超類實現基礎上添加新功能:

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

屬性觀察器重寫

重寫屬性會講超類的屬性觀察器添加到繼承的屬性,不論該屬性的實現方法如何都將能夠在繼承屬性的值更改時收到通知。

注意

不能將屬性觀察器添加到繼承的常量存儲型屬性或只讀計算型屬性,因為這些屬性值不能更改。不能為同一屬性同時提供重寫的setter和重寫的屬性觀察器,若要監聽屬性值的更改,并且已經提供重寫的setter,則可以簡單地監聽重寫的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 />

防止重寫

通過將方法、屬性或下標標記為final防止被子類重寫,如final varfinal funcfinal class funfinal subscript

任何試圖在子類中重寫標記為final的方法、屬性或下標都將報告編譯錯誤,也可以在擴展中使用final關鍵字。

可以在類定義中的class關鍵字之前添加final修飾符防止該類被子類化,任何試圖子類化標記為final的類都將報告編譯錯誤。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,461評論 6 532
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,538評論 3 417
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,423評論 0 375
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,991評論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,761評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,207評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,268評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,419評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,959評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,782評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,983評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,528評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,222評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,653評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,901評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,678評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,978評論 2 374

推薦閱讀更多精彩內容