- 在Swift中,继承是区分【类】与其他类型的一个基本特征。
-
不继承于其它类的类,称之为基类(base calss)。
-
子类生成(Subclassing)指的是在一个已有类的基础上创建一个新的类。子类继承超类的特性,并且可以优化或改变它。你还可以为子类添加新的特性。
-
子类可以为继承来的实例方法(instance method),类方法(class method),实例属性(instance property),或下标脚本(subscript)提供自己定制的实现(implementation)。我们把这种行为叫重写(overriding)。
-
你可以通过把方法,属性或下标脚本标记为final来防止它们被重写,只需要在声明关键字前加上final特性即可。(例如:final var, final func, final class func, 以及 final subscript)
// // main.swift // Inheritance // 继承 // // Created by TSUBASA on 15/12/18. // Copyright © 2015年 TSUBASA. All rights reserved. // import Foundation // 继承 /** * 在Swift中,继承是区分【类】与其他类型的一个基本特征 */ //base class 基类 class Vehicle { var currentSpeed = 0.0 var description: String { return "traveling at \(currentSpeed) miles per hour" } func makeNoise() { // 什么都不做 } } let someVehicle = Vehicle() print("Vehicle: \(someVehicle.description)") /** * 子类 class SomeSubclass: SomeSuperclass { } */ // 定义一个Vehicle的子类 class Bicycle: Vehicle { var hasBasket = false } let bicycle = Bicycle() bicycle.hasBasket = true bicycle.currentSpeed = 15.0 print("Bicycle: \(bicycle.description)") // 子类还可被其他类继承,成为父类 // 双人自行车类 继承于 自行车类 class Tandem: Bicycle { var currentNumberOfPassengers = 0 } let tandem = Tandem() tandem.hasBasket = true tandem.currentNumberOfPassengers = 2 tandem.currentSpeed = 22.0 print("Tandem: \(tandem.description)") // Overriding Methods 重写方法 class Train: Vehicle { override func makeNoise() { print("Choo Choo") } } let train = Train() train.makeNoise() 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 print("Car: \(car.description)") class AutomaticCar: Car { override var currentSpeed: Double { didSet { gear = Int(currentSpeed / 10.0) + 1 } } } let automatic = AutomaticCar() automatic.currentSpeed = 35.0 print("AutomaticCar: \(automatic.description)") /** * 防止重写 Preventing Overrides */ // 使用final特性 // final var, final func, final class func, final subscript // 如果重写了final方法,属性或下标属性,编译时不会报错。 // 也可以在类前加上final将整个类标记为final的,这样的类无法继承,任何试图继承此类,编译时会报错。