Swift之屬性重寫

引入

屬性繼承:子類可以繼承父類的屬性,包括存儲(chǔ)屬性、計(jì)算屬性和類型屬性,還可以繼承父類的屬性觀察器。
屬性重寫需要遵循一定原則,不然就會(huì)報(bào)錯(cuò)

屬性重寫原則

重寫使用override關(guān)鍵字
1、無(wú)論繼承的是存儲(chǔ)屬性還是計(jì)算屬性,子類都可以通過(guò)提供getter和setter對(duì)屬性進(jìn)行重寫
2、可以將一個(gè)繼承的屬性重寫為一個(gè)讀寫屬性
3、 不可以將繼承來(lái)的讀寫屬性重寫為只讀屬性
4、如果重寫時(shí)提供了setter方法,一定要提供getter方法

屬性觀察器重寫

1、無(wú)論父類有沒(méi)有為該屬性添加屬性觀察器,子類都可以添加屬性觀察器
2、如果父類已經(jīng)添加了屬性觀察器,當(dāng)屬性發(fā)生變化時(shí),父類與子類都會(huì)得到通知 父類仍然可以監(jiān)聽到屬性的變化

class Student {
   
    //存儲(chǔ)屬性
    var age :Int = 0
    var chineseScore :Double = 0.0
    var englishScore :Double = 0.0
    //計(jì)算屬性
    var averageScore :Double {//注意沒(méi)有等號(hào)
        
        //訪問(wèn)(獲取)調(diào)用get
        get{
            
            print("get") //只寫這一句為什么報(bào)錯(cuò)?
            
            return (chineseScore + englishScore) / 2  //必須加上return ,因?yàn)槟玫揭粋€(gè)值返回。
        }
        
        //設(shè)置值的時(shí)候
        set{
            
            print("set")
            print("set\(newValue)")
            //千萬(wàn)不要在這里設(shè)置值 會(huì)死循環(huán)  外部參數(shù)起名字newvalue
            //self.averageScore = newValue
        }
        
    }
    //只讀計(jì)算屬性
    var averageScore2 :Double {
        
        return (chineseScore + englishScore) / 2
    }
    
    //類屬性
    static var couseCount  = 3
    
    
    //懶加載屬性
    lazy var courses :[String] = {
        
        
        ()->[String] in
        
        print("懶加載屬性")
        return ["java", "html", "swift"]
    }()//()代表閉包執(zhí)行
    
    //屬性觀察器-有的屬性很重要,我希望關(guān)注每一次賦值的變化。 水晶球: 了解你的過(guò)去和將來(lái)
    //驗(yàn)證willSet和didSet作用
    //內(nèi)置變量:newValue oldValue
    var name:String = "tt" {
        
        //newValue
        willSet{
            print("父類willSet被調(diào)用,newValue\(newValue)")
        }
        
        //oldValue
        didSet{
            
            print("父類didSet被調(diào)用,oldValue\(oldValue)")
        }
    }
   
}

//屬性的繼承與重寫
class SeniorStudent : Student{
    
    //子類都可以通過(guò)提供getter和setter對(duì)屬性進(jìn)行重寫
    override var chineseScore: Double{
        
        get{
            
            return 90.5
        }
        
        set{
            
            
        }
        
    }
    
    //不可以將繼承來(lái)的讀寫屬性重寫為只讀屬性
    override var averageScore: Double{
        
        get{
            
            return 90.5
        }
        set{
                   
                   
        }
    }
    
    //如果父類已經(jīng)添加了屬性觀察器,當(dāng)屬性發(fā)生變化時(shí),父類與子類都會(huì)得到通知
   
    override var name:String{
        
        //newValue
        willSet{
            print("子類willSet被調(diào)用,newValue\(newValue)")
        }
        
        //oldValue
        didSet{
            print("子類didSet被調(diào)用,oldValue\(oldValue)")
        }
    }

    
}


var seniorStudent = SeniorStudent()
seniorStudent.name = "Wangwu"
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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