Swift中構造器的繼承和重寫


import Foundation

/*
構造器的繼承:
Swift的子類不會自動繼承父類的構造器, 若繼承, 則滿足如下規則:
1.如果子類沒有提供任何指定構造器, 那么它將自動繼承父類的所有指定構造器
2.如果子類實現了父類所有的指定構造器, 無論如何實現的, 都將自動繼承父類的所有便利構造器
*/

/*
構造器的重寫:
1.子類構造器重寫了父類的指定構造器, 必須添加override修飾符
2.子類中定義的構造器只是和父類中便利構造器的形參列表, 外部形參名相同, 不算重寫
*/

/*
總結:
1.如果一個子類沒有定義任何構造器, 那么它將自動繼承父類中的所有構造器
2.如果一個子類重寫父類的所有指定構造器, 那么它將自動繼承父類中的所有便利構造器
3.如果一個子類中任意的構造器和父類的便利構造器一模一樣, 不算重寫, 創建對象的時候也只會顯示子類定義的構造器
*/

class Person {
    
    var name: String!
    var weight: Double
    
    init(name: String) {
        self.name = name
        self.weight = 0.0
    }
    
    // 定義指定構造器
    init(name: String, weight: Double) {
        self.name = name
        self.weight = weight
    }
    
    // 定義便利構造器(使用convenience修飾)
    convenience init(n name: String, w weight: Double) {
        // 便利構造器必須調用同類中的指定構造器
        self.init(name: name, weight: weight)
    }
    
    convenience init(showStr: String) {
        self.init(name: "", weight: 0.0)
        print(showStr)
    }
}

class Man: Person {
    
    var sex: String = "男"
    
    override init(name: String) {
        // 子類的指定構造器中必須調用父類的指定構造器
        super.init(name: name)
        self.name = name
        self.weight = 0.0
    }
    
    override init(name: String, weight: Double) {
        super.init(name: name, weight: weight)
        self.name = name
        self.weight = weight
    }
    
    // 定義指定構造器與父類的便利構造器一樣, 這里不算重寫
    convenience init(showStr: String) {
        self.init(name: "", weight: 0.0)
        print(showStr)
    }
}

var man = Man(name: "Rinpe", weight: 62.0)
var man1 = Man(showStr: "HelloWorld")

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM