1. 概述
子类可以访问父类的方法,属性和小标脚本。并且可以覆盖父类的版本,实现自己的版本。
同样, 也可以在子类中给父类的属性(stored or computed)提供属性监视器。
2. 定义一个基类 Defining a Base Class
不是从任何类继承而来的来,称为基类。
如下,定义一个汽车的基类:
class Vehicle { var currentSpeed = 0.0 var description: String {//只读属性 return "traveling at \(currentSpeed) miles per hour" } func makeNoise() { // do nothing - an arbitrary vehicle doesn‘t necessarily make a noise } }
3. 子类 Subclassing
定义一个自行车类
class Bicycle: Vehicle { var hasBasket = false }
4. 重载(覆盖) Overriding
使用override
关键字在子类中覆盖父类的版本
5. 访问父类的方法、属性和小标脚本 Accessing Superclass Methods, Properties, and Subscripts
子类定义了自己的版本,覆盖父类的版本时,有时需要访问父类的版本,此时使用super
关键字访问父类版本,如:
super.someMethod()
super.someProperty
super[someIndex]
6. 覆盖方法 Overriding Methods
如,定义火车类:
class Train: Vehicle { override func makeNoise() { println("Choo Choo") } } let train = Train() train.makeNoise() // prints "Choo Choo"
7. 覆盖属性 Overriding Properties
7.1 覆盖get方法和set方法 Overriding Property Getters and Setters
你可以在子类中给父类的任何属性提供get方法和set方法。
在父类中为 read-only 属性,在子类中你可以给它同时提供 get 和 set 方法,使它在子类中为 read-write 属性。
反之不行,你不能将父类中 read-write 属性,在子类中覆盖为 read-only 。
如,car 类:
class Car: Vehicle { var gear = 1 override var description: String { return super.description + " in gear \(gear)" } } let car = Car() car.currentSpeed = 25.0 car.gear = 3 println("Car: \(car.description)") // Car: traveling at 25.0 miles per hour in gear 3
7.2 覆盖属性监视器 Overriding Property Observers
你可以给任何继承来的属性添加属性监视器,除开以下情况:
1)你不能在子类中给 inherited constant stored properties 和 inherited read-only computed properties 添加属性监视器,因为他们不可改变。
2)你不能再子类中同时提供覆盖的(重载的)set 方法和覆盖的(重载的)属性监视器,因为你可以在set方法中对属性值的变化作出反应。
class AutomaticCar: Car { override var currentSpeed: Double { didSet { gear = Int(currentSpeed / 10.0) + 1 } } } let automatic = AutomaticCar() automatic.currentSpeed = 35.0 println("AutomaticCar: \(automatic.description)") // AutomaticCar: traveling at 35.0 miles per hour in gear 4
8. 阻止覆盖Preventing Overrides
你可以通过final关键字让某个类中属性、方法和小标脚本无法被子类覆盖,如
final var
final func
final class func
final subscript
final class //这个类不能被任何类继承