Swift-继承、重写

继承、重写

/*
 1、继承语法
 继承是面向对象最显著的一个特征。继承是从已有的类中派生出新的类,新的类能吸收已有类的数据属性和行为,并能扩展新的能力。
 术语:基类(父类,超类),派生类(子类,继承类)
 swift继承语法:
 class ChildClass:FatherClass{
 }
 继承优点:代码重用
 继承缺点:增加程序耦合度,父类改变会影响子类
 swift没有多继承(单继承,没有继承方式,相当于公有继承)
 */
print("1、继承、super、override(重写)")
class Human{
    var name:String = ""
    var id:Int = 0
    func eat(){
        print("eat")
    }
    func drink(){
        print("drink")
    }
    func sleep(){
        print("sleep")
    }
}
//没有继承方式,可看成公有继承
class Woman: Human {
    func birth() {
        print("birth")
    }
    /*
     * override 重写关键字
     */
    override func eat() {
        super.eat()//一般super和override关键字配合使用
        print("woman eat")
    }
    //派生类中使用基类方法或者属性
    func eatAndSleep(){
        eat()//(从本类中开始查找方法)
        super.eat()//(从父类中查找方法)super关键字派生类中方法实现中,可以通过super关键字来引用基类的方法和属性
        sleep()
        birth()
    }
}

let h = Human()
let w = Woman()
h.name = "ming"
h.id = 78997
w.eat()
w.drink()
//w.eatAndSleep()
//h.birth()
print("w.name=\(w.name),w.id=\(w.id)")

/*
 2、重写属性
 */
print("\n2、重写属性")
class Father {
    var storeProperty:Int = 0
    var coupteProperty:Int {
        get {
            return 0;
        }
        set {
            print("In Father Class:set\(newValue)")
        }
    }
}
class Child: Father {
    //可以将一个父类的存储属性重写成计算属性,不可以将存储属性又重写成存储属性
    override var storeProperty:Int{
        get{
            return 10
        }
        set{
            print("In Child Class:set storeProperty with value=\(newValue)")
        }
    }
    //可以将父类中的计算属性重写,重写的样式也是计算属性样式
    override var coupteProperty:Int{
        get{
            return 10
        }
        set{
            print("In Child Class:set coupteProperty with value=\(newValue)")
        }
    }
}
let child = Child()
//通过子类的对象来调用重写后的属性或者方法,肯定会调用字类中的重写属性
child.storeProperty = 100
child.coupteProperty = 50

/*
 3、重写属性限制
 (1)属性重写时set和get方法都必须要都有
 (2)可读写的计算/存储属性不可以重写为只读的计算属性(权力变小)
 (3)只读的计算/存储属性可以在重写时变为读写的计算属性(权力变大)
 */

/*
 4、重写属性观察器
 (1)只能给非lazy属性的变量存储属性设定属性观察器,不能给计算属性设定属性观察器
  限制
 (1)不可以给只读的存储/计算属性,在子类中设定属性观察器
 */
class Observer{
    final var stroeProperty:Int = 0
    var computeProperty:Int{
        get{
            return 0
        }
        set{
            print("Do nothing")
        }
    }
}
class ChildOfObserver: Observer {
//    //可以重写父类中变量存储属性的属性观察器
//    override var stroeProperty: Int{
//        willSet{
//            print("will set")
//        }
//        didSet{
//            print("did set")
//        }
//    }
    //可以重写父类中的计算属性的属性观察器
    override var computeProperty: Int{
        willSet{
            print("compute will set")
        }
        didSet{
            print("compute did set")
        }
    }
}
let ob = ChildOfObserver()
ob.computeProperty = 9
ob.stroeProperty = 10

/*
 5、防止重写(final)
 */


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值