引入
屬性繼承:子類可以繼承父類的屬性,包括存儲(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"