从这篇文章,你将学习到 Swift 的继承,继承是类独有的特性,让我们开始吧。

Swift Inheritance

定义基类

不继承于其他类的类就是基类,注意 Swift 中定义的基类不会再自动继承于一个统一的基类,很多其他编程语言会这样。

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

定义子类

子类继承了来自父类的功能,还可以再添加自己的功能。

class Bicycle: Vehicle {
  var hasBasket = false
}

覆盖

覆盖父类的方法,属性和下标,需要在定义前面添加 override,如果覆盖了父类方法,却没有写 override,编译器会报错,避免不小心覆盖父类方法的失误。

访问父类的方法,属性和下标

在覆盖父类的功能,添加新的功能时,还可以复用父类的功能。

super.someMethod()
super.someProperty
super[someIndex]

覆盖方法

class Train: Vehicle {
  override func makeNoise() {
    print("Choo Choo")
  }
}

覆盖属性的 get 和 set

无论继承的属性是通过存储属性,还是计算属性来实现的,都可以通过提供 getset 来覆盖。继承的只读属性可以变成读写属性,但是继承的读写属性不可以变成只读属性。

class Car: Vehicle {
  var gear = 1
  override var description: String {
    return super.description + " in gear \(gear)"
  }
}

覆盖属性观察者

无论继承的属性是通过存储属性,还是计算属性来实现的,都还可以提供属性观察者。

class AutomaticCar: Car {
  override var currentSpeed: Double {
    didSet {
      gear = Int(currentSpeed / 10.0) + 1
    }
  }
}

避免覆盖

在定义父类时,不希望子类覆盖的功能,可以通过修饰符 final 来实现。

final var
final func
final subscript
final class