天天看點

Swift學習筆記13——類繼承(Inheritance)

繼承是類獨有的,結構體和枚舉類都不具有這個功能。

繼承就好像子承父業一樣,一個繼承的類(稱為子類subClass)可以獲得被繼承的類(稱為父類superClass)的屬性,方法和其他特性。

子類可以重寫父類的方法,也可以添加自己的屬性,還可以為繼承而來的屬性添加觀察器(對繼承而來的存儲和計算屬性都可以)

基類

一個不繼承自任何類的類稱為基類。在Swift中,是沒有共同的終極父類的。oc和java都是有終級父類的。下面定義一個Animal基類。

class Animal {
    var life : Int = 0
    var description: String{
        return "An animal with a life of \(life)"
    }
    
    func makeSounds() {
    
    }
}
           

繼承文法

<span style="color:#ff0000;">class Dog: Animal</span> {
    var name : String = "larry"
}
           

上面的Dog類繼承自Animal類,并且添加了自己的name屬性。我們可以修改一下dog繼承的屬性,然後列印一下

var dog = Dog()
dog.life = 10
print("dog's life is",dog.life)  //dog's life is 10
           

覆寫(override)父類屬性

對于繼承而來的存儲屬性或者計算屬性,我們可以通過重寫這個屬性的getter和setter方法來實作覆寫。下面是幾條規則:

1、當你重寫了setter方法的時候,一定要重寫getter方法。但是可以隻重寫getter方法。

2、覆寫屬性的時候,屬性名和類型都必須和繼承的屬性一緻才算覆寫。并且前面要加上override關鍵字。

3、你可以将繼承的隻讀屬性重寫為讀寫屬性,但是不能将繼承的讀寫屬性重寫為隻讀屬性。

下面重寫Animal的description屬性

class Dog: Animal {
    var name : String = "larry"
    override var description: String {
        get{
            return "It's a dog with the name of \(name)"
        }
    }
}
           

覆寫屬性觀察器

規則:

1、不能對繼承的常量,或者隻讀屬性添加屬性觀察器

2、不能同時對一個繼承屬性同時添加屬性觀察器和setter方法。因為setter方法已經可以提供屬性觀察器的功能。

3、即使覆寫了之後,如果父類的該屬性有觀察器,那麼當值修改的時候,父類的觀察器也會被調用。

class Dog: Animal {
    var name : String = "larry"
    
    override var life: Int {
        didSet{
            print("The dog's life is \(life)")
        }
    }
    
    override var description: String {
        get{
            return "It's a dog with the name of \(name)"
        }
    }
    
}
           

覆寫父類方法

同樣的,加上override後,重寫父類方法就可以

override func makeSounds() {
        print("wang! wang!")
}
           

防止覆寫

使用final關鍵字去修飾就可以了。比如

final var

final func,

final class func,

final subscript