子类可继承父类中的方法,而不需要重新编写相同的方法。但有时子类并不想原封不动地继承父类的方法,而是想作一定的修改,这就需要采用方法的重写。
如果要重写某个特性,就需要在定义前面加上override关键字,这样就表明子类要重写父类的属性或方法,而不是重复定义。
子类可以重写父类的属性、属性观察器、方法、下标脚本。
class Person{
subscript (index:Int) -> String{
switch index{
case 1:
return "1"
case 2:
return "2"
case 3:
return "3"
default:
return "default"
}
}
var age = 20{
willSet{
print("Person.age即将被赋值\(newValue)")
}
didSet{
if(age > oldValue){
print("Person新赋值的值比原来的大")
}else{
print("Person新赋值的值比原来的小")
}
}
}
func run(){
print("Person is running")
}
}
class Teacher : Person{
override var age:Int{
willSet{
print("Teacher.age即将被赋值\(newValue)")
}
didSet{
if(age > oldValue){
print("Teacher新赋值的值比原来的大")
}else{
print("Teacher新赋值的值比原来的小")
}
}
}
override func run(){
print("Teacher is walking")
}
override subscript (index:Int) -> String{
switch index{
case 1:
return "1+!"
case 2:
return "2+!"
case 3:
return "3+!"
default:
return "default+!"
}
}
}
控制台:
Person is running
Teacher is walking
Teacher.age即将被赋值15
Person.age即将被赋值15
Person新赋值的值比原来的小
Teacher新赋值的值比原来的小
3+!
3
tips:
重写属性时注意:
1、可以讲一个继承来的属性重写为一个读写属性。
2、不可以将继承来的读写属性重写为只读属性。
3、如果在重写属性时提供的setter方法,那么一定要提供getter方法
重写属性观察器要注意:
1、无论父类有没有为该属性添加属性观察器,子类都可以添加属性观察器,如果父类已经添加了属性观察器,则当属性发生变动是,父类和子类都会得到通知。
2、属性观察器不能用于计算属性,只能用于存储属性,因为计算属性在setter离就可以获取到属性的变化。
网友评论