Swift基础篇 - 继承

201 阅读3分钟

1.定义基类

任何不从另一类继承的类都是所谓的基类

Swift类不会从一个通用基类继承。没有指定特定父类的类都会以基类的形式创建

class Vehicle {

    var currentSpeed = 0.0

    var description : String {

    return "traveling at (currentSpeed) miles per hour"

  }

  func makeNoise () {
  
  }

}

2.子类

  • 子类是基于现有类创建新类的行为。子类从现有的类继承了一些特征。可以重新定义它们,也可以为子类添加新的特征
  • 为了表明子类有父类,要把子类写在父类的前面,用冒号隔开
class Bicyle : Vehicle {

  var hasBasket = false

}

let bicycle = Bicyle()

bicycle.hasBasket = true

bicycle.currentSpeed = 15

print("Bicycle:(bicycle.description)")

3.重写

  • 子类可以提供它自己的实例方法、类方法、实例属性、类型属性或下标脚本的自定义实现,否则他将会从父类继承。这就是所谓重写
  • 要重写而不是继承一个特征,需要在重写定义前面加上override关键字。这样做说明打算提供一个重写而不是意外提供了一个相同的定义。意外的重写可能导致意向不到的行为,并且任何没有使用override关键字的重写都会在编译是诊断为错位

3.1.访问父类方法、属性和小标脚本

  1. 可以通过使用super的前缀访问父类的方法,属性或小标脚本
  2. 一个命名为someMethod()的重写方法可以通过super.someMethod()在重写方法的实现中调用父类版本的someMethod()方法
  3. 一个命名为someProperty的重写属性可以通过super.someProperty在重写的getter或setter实现中访问父类版本的someProperty属性
  4. 一个命名为someIndex的重写脚本可以使用super[someIndex]在重写的下标脚本实现中访问父类版本中相同的下标脚本

3.1.1. 重写方法

可以在子类中写一个继承的实例或类型方法来提供定制或替代的方法实现

class Train : Vehicle {

  override func makeNoise() {

    print("呼呼呼")

  }

}

let train = Train()

train.makeNoise()

3.1.2. 重写属性的getter和setter

客户提供一个自定义的getter(和setter,如果合适的话)来重写任意继承的属性,无论在最开始继承的属性实现为存储性还是计算属性

class Car : Vehicle {

  var gear = 1

  override var description: String {

    return super.description + "in gear (gear)"

  }

}



let car = Car()

car.currentSpeed = 35

car.gear = 3

print("Car : (car.description)")

3.1.3. 重写属性的观察器

  • 可以使用属性重写来为继承的属性添加属性观察器。这就可以在继承属性的值改变时得到通知,无论这个属性最初如何实现
  • 不能给继承而来的常量存储属性或者只读的计算属性添加属性观察器。这些属性的值不能被设置,所以提供willSet或didSet实现作为重写的一部分也是不合适的
  • 不能为同一个属性同时提供重写setter和重写的属性观察器。如果想要监听属性的改变,并且已经为那个属性提供了一个自定义的setter,那么从自定义的setter里可以监听任意值的改变
class AutomaticCar : Car {

  override var currentSpeed: Double {

    didSet {

      gear = Int(currentSpeed / 10) + 1

    }

  }

}



let automatic = AutomaticCar()

automatic.currentSpeed = 35.0

print("AutomaticCar : (automatic.description)")

3.2. 阻止重写

可以通过标记为final来阻止一个方法、属性或者下标脚本被重写。通过在方法、属性或者下标脚本的关键字前些finanl修饰符(比如final var, final fucn, final calss func, funal subscript)