Swift从入门到精通第十篇 - 继承 初识

继承(学习笔记)

环境Xcode 11.0 beta4 swift 5.1

  • 继承
    • 一个类可以从另一个类继承方法、属性及其它的特征
    • 子类可以调用和访问属于其父类的方法、属性和下标,并可以提供这些方法、属性和下标的重写版本,以改进或修改它们的行为
    • 子类还可以为继承的属性添加属性(存储属性和计算属性)观察者
  • 定义一个基类
    • Swift 不像 OC 有一个基类 NSObject, 任何一个不继承其它类的类都是基类

      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
          }
      }
      let someVehicle = Vehicle()
      print("Vehicle: \(someVehicle.description)")
      // Vehicle: traveling at 0.0 miles per hour
  • 子类wx
    • 定义一个子类

      class Bicycle: Vehicle {
          var hasBasket = false
      }
      let bicycle = Bicycle()
      bicycle.hasBasket = true
      bicycle.currentSpeed = 15.0
      print("Bicycle: \(bicycle.description)")
      // Bicycle: traveling at 15.0 miles per hour
  • 重写
    • 子类重写父类的方法、属性、下标要用关键字 override, 编译器会根据此关键字进行检查父类是不有提供相应的声明
    • 重写的方法、属性、下标想要访问父类可以用 super 关键字,如 super.someMethodsuper.somePropertysuper[someIndex]
    • 方法重写

      class Train: Vehicle {
          override func makeNoise() {
              print("Choo Choo")
          }
      }
      let train = Train()
      train.makeNoise()
      // Prints "Choo Choo"
    • 属性重写,可以为实例和类型属性添加自己的 gettersetter(可选的)以及 属性观察器,如果父类属性是 read-only 继承后可以 read-write,反之不行

      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)")
      // Car: traveling at 25.0 miles per hour in gear 3
      // 同一个属性不能同时重写 setter 和 属性观察器,如果想观察值的变化可以直接在自定义 setter 中观察
      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)")
      // AutomaticCar: traveling at 35.0 miles per hour in gear 4
  • 禁止重写
    • 可以用 final 标识符禁止被继承(如: final var, final func, final class func, final subscript, final class),如果被 final 修饰仍尝试继承,将会在编译期报错
    [Swift从入门到精通]