引入
属性继承:子类可以继承父类的属性,包括存储属性、计算属性和类型属性,还可以继承父类的属性观察器。
属性重写需要遵循一定原则,不然就会报错
属性重写原则
重写使用override关键字
1、无论继承的是存储属性还是计算属性,子类都可以通过提供getter和setter对属性进行重写
2、可以将一个继承的属性重写为一个读写属性
3、 不可以将继承来的读写属性重写为只读属性
4、如果重写时提供了setter方法,一定要提供getter方法
属性观察器重写
1、无论父类有没有为该属性添加属性观察器,子类都可以添加属性观察器
2、如果父类已经添加了属性观察器,当属性发生变化时,父类与子类都会得到通知 父类仍然可以监听到属性的变化
class Student {
//存储属性
var age :Int = 0
var chineseScore :Double = 0.0
var englishScore :Double = 0.0
//计算属性
var averageScore :Double {//注意没有等号
//访问(获取)调用get
get{
print("get") //只写这一句为什么报错?
return (chineseScore + englishScore) / 2 //必须加上return ,因为拿到一个值返回。
}
//设置值的时候
set{
print("set")
print("set\(newValue)")
//千万不要在这里设置值 会死循环 外部参数起名字newvalue
//self.averageScore = newValue
}
}
//只读计算属性
var averageScore2 :Double {
return (chineseScore + englishScore) / 2
}
//类属性
static var couseCount = 3
//懒加载属性
lazy var courses :[String] = {
()->[String] in
print("懒加载属性")
return ["java", "html", "swift"]
}()//()代表闭包执行
//属性观察器-有的属性很重要,我希望关注每一次赋值的变化。 水晶球: 了解你的过去和将来
//验证willSet和didSet作用
//内置变量:newValue oldValue
var name:String = "tt" {
//newValue
willSet{
print("父类willSet被调用,newValue\(newValue)")
}
//oldValue
didSet{
print("父类didSet被调用,oldValue\(oldValue)")
}
}
}
//属性的继承与重写
class SeniorStudent : Student{
//子类都可以通过提供getter和setter对属性进行重写
override var chineseScore: Double{
get{
return 90.5
}
set{
}
}
//不可以将继承来的读写属性重写为只读属性
override var averageScore: Double{
get{
return 90.5
}
set{
}
}
//如果父类已经添加了属性观察器,当属性发生变化时,父类与子类都会得到通知
override var name:String{
//newValue
willSet{
print("子类willSet被调用,newValue\(newValue)")
}
//oldValue
didSet{
print("子类didSet被调用,oldValue\(oldValue)")
}
}
}
var seniorStudent = SeniorStudent()
seniorStudent.name = "Wangwu"