Swift 继承(十二)

继承 (Inheritance)

一个类可以继承另一个类的方法,属性和其他特特性,继承类叫子类,被继承叫父类,Swift中,类可以调用和访问父类的方法,属性和附属脚本,并且可以重写来修改他们的行为

1.定义基类 (Base class)

不继承与其他类的类,称为基类
class Vehicle {
    var numberOfWheels: Int
    var maxPassengers: Int
    func description() -> String {
        return "\(numberOfWheels) wheels; up to \(maxPassengers) passengers"
    }
    init() {
        numberOfWheels = 0
        maxPassengers = 1
    }
}
构造器的最简形式就像一个没有参数的实例方法,使用init关键字
init() {
    // perform some initialization here
}

2.子类

将父类写在子类的后面,用冒号分隔
class SomeClass: SomeSuperclass {
    // class definition goes here
}
// Bicycle继承了Vehicle的属性和方法
class Bicycle: Vehicle {
    init() {
        super.init()
        numberOfWheels = 2
    }
}
let bicycle = Bicycle()
println("Bicycle: \(bicycle.description())")
// Bicycle: 2 wheels; up to 1 passengers

// 子类可以继续被其他类继承
class Tandem: Bicycle {
    init() {
        super.init()
        maxPassengers = 2
    }
}

3.重写

子类为继承来的实例方法,类方法,实例属性或附属脚本提供自己定制的实现,称为重写
需要在前面加上 override 关键字标明是要提供一个重写版本而非提供一个相同的定义,override提醒Swift去检查该类的父类是否有匹配的方法,可保证重写定义是正确的

访问父类的方法,属性及附属脚本
使用super前缀
方法: super.someMethod()
属性: super.someProperty
附属脚本: super[someIndex]

3.1重写方法

class Car: Vehicle {
    var speed: Double = 0.0
    init() {
        super.init()
        maxPassengers = 5
        numberOfWheels = 4
    }
    override func description() -> String {
        return super.description() + "; "
            + "traveling at \(speed) mph"
    }
}
let car = Car()
println("Car: \(car.description())")
// Car: 4 wheels; up to 5 passengers; traveling at 0.0 mph

3.2重写属性

重写属性的时候,必须把名字和类型都写出来,让编译器检查重写的属性是否与父类匹配
// min函数是Swift标准库中的一个全局函数,接收两个或多个参数,返回最小的那个
class SpeedLimitedCar: Car {
    override var speed: Double  {
    get {
        return super.speed
    }
    set {
        super.speed = min(newValue, 40.0)
    }
    }
}
let limitedCar = SpeedLimitedCar()
limitedCar.speed = 60.0
println("SpeedLimitedCar: \(limitedCar.description())")
// SpeedLimitedCar: 4 wheels; up to 5 passengers; traveling at 40.0 mph

3.3重写属性监视器

可以在属性中重写为一个继承来得属性添加属性监听器,当继承的属性值发生变化,就会被通知
class AutomaticCar: Car {
    var gear = 1
    override var speed: Double {
    didSet {
        gear = Int(speed / 10.0) + 1
    }
    }
    override func description() -> String {
        return super.description() + " in gear \(gear)"
    }
}
let automatic = AutomaticCar()
automatic.speed = 35.0
println("AutomaticCar: \(automatic.description())")
// AutomaticCar: 4 wheels; up to 5 passengers; traveling at 35.0 mph in gear 4

3.4防止重写

使用 @final 来防止被子类重写( @final var , @final func, @final class func, @final subscript)



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值