Swift 十:繼承

1).繼承的概念和語法

繼承是面向?qū)ο箫@著的一個特性,指從已有的類中派生出新的類,新的類能吸收已有類的數(shù)據(jù)屬性和行為,并能拓展新的能力。

術(shù)語:

    基類(父類、超類) 
   
    派生類(子類、繼承類)

swift繼承的語法:

 class ChildClass : FatherClass {    
 
  }
 

繼承優(yōu)點:

  • 代碼重用

繼承缺點:

  • 增加代碼耦合度
  • 父類的改變會影響子類

注意:swift同oc一樣,沒有多繼承

代碼實例:

class Human {
    
    var age = 0
}

class Woman: Human {
    
}

let nana = Woman()

nana.age = 10


2).super關(guān)鍵字

class Human {
    
    func eatFunc() {
        
    }
}

class birthFunc: Human {
    
    func birth()  {
    
        eatFunc() // 從當(dāng)前類開始查找
        
        super.eatFunc() //從當(dāng)前類的父類開始查找
    }
}

3).重寫方法

如果派生類中有方法或者屬性命名跟基類中的一模一樣,則可以進(jìn)行屬性或者方法重寫

swift中重寫方法,需要在前面加上關(guān)鍵字override

class Human {
    
    func eatFunc() {
        
    }
}

class birthFunc: Human {

    override func eatFunc() { //重寫基類中的方法
        
    }
}

重寫后,通過子類實例調(diào)用重寫的方法,優(yōu)先調(diào)用子類重寫的方法

重寫時候,如果仍想先調(diào)用父類方法,然后再調(diào)用自己重寫的方法,
可以加上super關(guān)鍵字

class Human {
    
    func eatFunc() {
        
    }
}

class birthFunc: Human {

    override func eatFunc() { //重寫基類中的方法
        
        super.eatFunc()
    }
}

4).重寫屬性

swift中父類的存儲屬性可以在子類中重寫為計算屬性,但是不可以重寫為存儲屬性

class Father {
    
    var storeProperty = 3 // 存儲屬性
}

class Child : Father {

    override var storeProperty: Int { //類中重寫屬性,可以把父類中的存儲屬性,重寫為計算屬性
        
        get {
            
            return 10
        }
        
        set {
            
            print("storeProperty")
        }
    }
}

var child = Child()

print(child.storeProperty) // 通過子類的對象,來調(diào)用重寫后的方法或者屬性,會優(yōu)先調(diào)用子類中的重寫版本

swift中父類的計算屬性可以在子類中重寫為計算屬性

class Father {
    
    var storeProperty : Int { // 計算屬性
        
        get {
            
            return 10
        }
        
        set {
        }
    }
}

class Child : Father {

    override var storeProperty: Int { //子類中重寫屬性,可以把父類中的計算屬性,重寫為計算屬性
        
        get {
            
            return 10
        }
        
        set {
        }
    }
}

基類中的計算屬性和存儲屬性,都可以派生類中重寫為計算屬性

屬性重寫限制:

  • 重寫時,在子類中只有set方法沒有g(shù)et方法是否可以:不可以
  • 重寫時,父類中只讀的計算/存儲屬性,是否能夠重寫為讀寫計算屬性(子類中權(quán)利變大):可以
  • 重寫時,父類中可讀寫的計算/存儲屬性,是否能夠重寫為只讀的計算屬性(子類中權(quán)利變小):不可以

5).重寫屬性觀察器

swift中,本類中,只能給非lazy的變量存儲屬性添加屬性觀察器,不能給計算屬性添加。

但是,可以在子類中,重寫父類的計算屬性的屬性觀察器。

也即,在子類中,既可以重寫父類的存儲屬性的觀察器,也可以重寫父類中的計算屬性的觀察器。

重寫屬性觀察器的限制:

  • 不可以給只讀的計算/存儲屬性,在子類中設(shè)定屬性觀察器。

6).final防止方法或者屬性重寫

1.在前面加final關(guān)鍵字

class Father {
    
    final var storeProperty : Int = 0
}

finaloverride是互斥的

2.當(dāng)在類聲明時,在class關(guān)鍵字前加final,可以防止類被繼承

final class Father {
    
    final var storeProperty : Int = 0
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容