swift重写

子类可继承父类中的方法,而不需要重新编写相同的方法。但有时子类并不想原封不动地继承父类的方法,而是想作一定的修改,这就需要采用方法的重写。

如果要重写某个特性,就需要在定义前面加上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离就可以获取到属性的变化。

你可能感兴趣的:(swift重写)