《從零開始學Swift》學習筆記(Day 44)——重寫屬性

原創文章,歡迎轉載。轉載請註明:關東昇的博客 php

重寫實例屬性java

咱們能夠在子類中重寫從父類繼承來的屬性,屬性有實例屬性和靜態屬性之分,他們在具體實現也是不一樣的。微信

實例屬性的重寫一方面能夠重寫gettersetter訪問器,另外一方面能夠重寫屬性觀察者。ide

計算靜態屬性須要使用gettersetter訪問器,而存儲屬性不須要。子類在繼承父類後,也能夠經過gettersetter訪問器重寫父類的存儲屬性和計算屬性。網站

下面看一個示例:spa

class Person {
    
    var name: String        //存儲屬性
    var age: Int            //存儲屬性
    
    func description() -> String {
        return "\(name) 年齡是: \(age)"
    }
    
    init (name: String, age: Int) {
        self.name = name
        self.age  = age
    }
}
 
class Student: Person {
    
    var school: String      
    
    override var age: Int { //重寫屬性前面要添加override關鍵字
        get {
         return super.age    
        }
        set {
         super.age = newValue < 8 ? 8: newValue  
        }
    }                               
       
    convenience init() {
        self.init(name: "Tony", age: 18, school: "清華大學")
    }
    
    init (name: String, age: Int, school: String) {
        self.school = school
        super.init(name: name, age: age)
    }
}
 
let student1 = Student()
print("學生年齡:\(student1.age)")
student1.age = 6
print("學生年齡:\(student1.age)")

從屬性重寫可見,子類自己並不存儲數據,數據是存儲在父類的存儲屬性中的。.net

以上示例是重寫屬性gettersetter訪問器,咱們還能夠重寫屬性觀察者,代碼以下:設計

class Person {
    
    var name: String
    var age: Int
    
    func description() -> String {
        return "\(name) 年齡是: \(age)"
    }
    
    init (name: String, age: Int) {
        self.name = name
        self.age  = age
    }
}
 
class Student: Person {
    
    var school: String
    
    override var age: Int {  //重寫了age屬性觀察者
     willSet {              //若是隻關注修改以前的調用,能夠只重寫willSet觀察者
         print("學生年齡新值:\(newValue)")  
 
     }
     didSet{                //若是隻關注修改以後的調用,能夠只重寫didSet觀察者
         print("學生年齡舊值:\(oldValue)") 
     }
    }                                   
    
    convenience init() {
        self.init(name: "Tony", age: 18, school: "清華大學")
    }
    
    init (name: String, age: Int, school: String) {
        self.school = school
        super.init(name: name, age: age)
    }
}
 
let student1 = Student()
print("學生年齡:\(student1.age)")
Student1.age = 6               
print("學生年齡:\(student1.age)")

代碼Student1.age = 6修改了age屬性,修改先後的輸出結果以下:rest

學生年齡新值:6code

學生年齡舊值:18

 

重寫靜態屬性

在類中靜態屬性定義使用classstatic關鍵字,可是使用哪個要看子類中是否重寫該屬性。class修飾的屬性能夠被重寫,static關鍵字就不能被重寫。

示例代碼以下:

class Account {
    
    var amount: Double = 0.0                // 帳戶金額
    var owner: String = ""                   //帳戶名
    
    var interestRate: Double = 0.0668     //利率
    
    //class不能換成static
    class var staticProp: Double {              //靜態屬性staticProp
        return 0.0668 * 1_000_000
    }
    
    var instanceProp: Double {
        return self.interestRate * self.amount
    }
}
 
class TermAccount: Account {
    
    //class換成static
    override class var staticProp: Double {     //重寫靜態屬性staticProp
        return 0.0700 * 1_000_000
    }
}
 
//訪問靜態屬性
print(Account.staticProp)  
print(TermAccount.staticProp

)

因爲要被重寫因此代碼class var staticProp: Double 中的class不能換成static。代碼override class var staticProp: Double中的靜態屬性staticProp可使用classstatic,除非在TermAccount的子類中重寫屬性staticProp

 

歡迎關注關東昇新浪微博@tony_ 關東昇。
關注智捷課堂微信公共平臺,瞭解最新技術文章、圖書、教程信息
 

更多精品iOSCocos、移動設計課程請關注智捷課堂官方網站:http://www.zhijieketang.com
智捷課堂論壇網站:http://51work6.com/forum.php

相關文章
相關標籤/搜索