继承 (Inheritance)
一个类可以继承另一个类的方法,属性和其他特特性,继承类叫子类,被继承叫父类,Swift中,类可以调用和访问父类的方法,属性和附属脚本,并且可以重写来修改他们的行为
需要在前面加上 override 关键字标明是要提供一个重写版本而非提供一个相同的定义,override提醒Swift去检查该类的父类是否有匹配的方法,可保证重写定义是正确的
访问父类的方法,属性及附属脚本
使用super前缀
一个类可以继承另一个类的方法,属性和其他特特性,继承类叫子类,被继承叫父类,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