swift之类的继承、父类方法重写、属性值监听

基类(Base Class)被子类(Subclassing)继承,这个OC的继承思想很相似,唯一的不同就是语法的规范不一样。

1、新建一个基类

首先我们新建一个基类(Vehicle)声明一个属性(currentSpeed), 一个只读计算型属性(description),

在基类中定义一个方法makeNoise():

import UIKit

class Vehicle {

    var currentSpeed = 0.0
    var description: String{
        return "traveling at \(currentSpeed) miles per hour"
    }
    func makeNoise() {
    }
}

2、新建子类,继承基类

新建子类(Bicycle),并在子类中添加子类自己的属性(这些属性是基类没有的)hasBasket(bool型)、gear(Int型)、color(String型):

import UIKit

class Bicycle: Vehicle {
    var hasBasket = false
    var color:String = "red"
    var gear = 1
}

3、在子类中重新父类方法 makeNoise()

子类可以为继承来的实例方法(instance method),类方法(class method),实例属性(instance property),或下标脚本(subscript)提供自己定制的实现(implementation)。我们把这种行为叫重写(overriding)。重新某个特性(方法、属性)都需要在前面加 override关键字。

override func makeNoise() {
        print("重新父类的makeNoise()方法")
    }

4、重写父类的属性 description

子类并不知道继承来的属性是存储型的还是计算型的,它只知道继承来的属性会有一个名字和类型。你在重写一个属性时,必需将它的名字和类型都写出来:

override var description: String{
    return super.description + "color is \(color)"
    }


5、重写属性(currentSpeed)观察器(Property Observer)

可以通过重写属性为一个继承来的属性添加属性观察器。这样一来,当继承来的属性值发生改变时,你就会被通知到,无论那个属性原本是如何实现的。

注意
你不可以为继承来的常量存储型属性或继承来的只读计算型属性添加属性观察器。这些属性的值是不可以被设置的,所以,为它们提供willSetdidSet实现是不恰当。
此外还要注意,你不可以同时提供重写的 setter 和重写的属性观察器。如果你想观察属性值的变化,并且你已经为那个属性提供了定制的 setter,那么你在 setter 中就可以观察到任何值变化了。

override var currentSpeed: Double{
        didSet{
            gear = Int(currentSpeed/10.0) + 1
        }
    }
即:当对currentSpeed属性进行赋值时实现didset方法,gear的值也跟着变化了。

实例一个 子类(Bicycle)并对父类的属性(currentSpeed)进行赋值 10000,可以打印出gear的值是:1001

let bicycle = Bicycle()
        bicycle.currentSpeed = 10000
        print("bicycle.gear: \(bicycle.gear)")






  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

启程Boy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值